^和!的意义C中的运营商

时间:2014-12-20 15:11:41

标签: c

k的值为2.我编辑了问题,发现(!i^j)(i^!j)给出了值0,但(!i^!j)给出了值1.为什么?

#include <stdio.h> 
int main(void)
{ 
    int i = 1, j = 0, k; 
    k = (i ^ j) + (!i ^ j) + (i ^ !j) + (!i ^ !j); 
    printf("%d",k); 
    return 0; 
}

3 个答案:

答案 0 :(得分:3)

你这里有四个表达式,每个表达式产生1或0.整体表达式加起来。

以下是ij替换为各自值的表达式:

 1 ^  0 //  i ^  j
!1 ^  0 // !i ^  j
 1 ^ !0 //  i ^ !j
!1 ^ !0 // !i ^ !j

一元NOT !的优先级高于二元XOR ^的优先级,因此^计算结束如下:

1 ^ 0 --> 1 //  i ^  j
0 ^ 0 --> 0 // !i ^  j
1 ^ 1 --> 0 //  i ^ !j
0 ^ 1 --> 1 // !i ^ !j

这是因为二进制XOR ^仅在其中一个参数为1而另一个为零时才生成1

第一个和最后一个子表达式产生1;中间的那些产生0

答案 1 :(得分:2)

!是logaical NOT运算符,^是XOR运算符,所以这就是正在发生的事情:

int i = 1, j = 0, k;

逻辑NOT运算符:

(不要将逻辑NOT与按位NOT混淆!)

!1 -> 0
!0 -> 1

XOR运营商:

0 ^ 0 -> 0
0 ^ 1 -> 1
1 ^ 0 -> 1
1 ^ 1 -> 0

1 i ^ j

0000 0001 //i 
0000 0000 //j
--------- XOR ^
0000 0001 = 1 = k

2 !i ^ j

1 //i
- NOT !
0 = 0

0000 0000 //i
0000 0000 //j
--------- XOR ^
0000 0000 = 0 = k

3 i ^ !j

0 //j
- NOT !
1 = 1

0000 0001 //i
0000 0001 //j
--------- XOR ^
0000 0000 = 0 = k

4 !i ^ !j

1 //i
- NOT !
0 = 0

0 //j
- NOT !
1 = 1

0000 0000 //i
0000 0001 //j
--------- XOR ^
0000 0001 = 1 = k

答案 2 :(得分:2)

对于i = 1,j = 0

! ==逻辑非运算符

!i = 0
!j = 1

对于i ^ j(读作我exor j,^是exor运算符),具有不同i和j值的真值表将是:

i j i^j
0 0  0
0 1  1
1 0  1
1 1  0

看到相同的i和i exor返回0.所以在你的情况下(!i^!j) = 0 ^ 1,从真值表上面是1,因此你看到的是它。