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;
}
答案 0 :(得分:3)
你这里有四个表达式,每个表达式产生1或0.整体表达式加起来。
以下是i
和j
替换为各自值的表达式:
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,因此你看到的是它。