可能重复:
C 中的双重否定:是否保证返回 0/1?
int main(void)
{
int i = 2, j = 1;
printf("%d", !!i +!j);
return 0;
}
据我了解,!!将表达式转换为布尔值,所以它是说因为 i 不等于 2 值是 0 + j 不等于 1 值是 0,并且由于 0 等于 false 它读取: false + false = true which代表1的值。请帮助我是C编程的新手。
可能重复:
C 中的双重否定:是否保证返回 0/1?
int main(void)
{
int i = 2, j = 1;
printf("%d", !!i +!j);
return 0;
}
据我了解,!!将表达式转换为布尔值,所以它是说因为 i 不等于 2 值是 0 + j 不等于 1 值是 0,并且由于 0 等于 false 它读取: false + false = true which代表1的值。请帮助我是C编程的新手。
C 没有布尔类型(好吧,C99 和更新版本有,但您的程序中没有使用它)。
!
只是一个一元运算符,它变成0
和1
其他任何东西变成0
. 所以在你的情况下,因为i
is 2
、!i
is0
和!!i
is 1
。 j
是1
,所以!j
是0
。剩下!!i + !j
的就是1 + 0
,你正在打印1
。试试这个示例程序来看看它的实际效果:
#include <stdio.h>
int main(void)
{
int i = 2, j = 1;
printf("i = %d, j = %d\n", i, j);
printf("!i = %d, !!i = %d\n", !i, !!i);
printf("!j = %d\n", !j);
printf("!!i + !j = %d + %d = %d\n", !!i, !j, !!i + !j);
return 0;
}
!x
如果x
为真(即不等于 0)则为 0,如果x
为假(即等于 0)则为 1。由于您的示例i
为 2,因此将为!i
0,因此!!i
将为 1。同样!j
为 0。因此表达式的结果将为1 + 0 = 1
。
请注意,在任何情况下0 + 0
(即 false + false)都不会等于 1。
以下是规范中关于!
运营商的说明(C99 §6.5.3.3/5)。简洁的最后一句话是理解其行为所真正需要的:
逻辑否定运算符的结果
!
是0
如果其操作数的值比较不等于0
,1
如果其操作数的值比较等于0
。结果有类型
int
。表达式
!E
等价于(0==E)
。
我们可以使用第三句的转换来评估您的表达式,!!i + !j
。变换变为:
(0 == (0 == i)) + (0 == j)
我们可以如下评估它:
(0 == (0 == 2)) + (0 == 1) // substitute the variable values
(0 == (0 )) + (0 == 1) // 0 == 2 is false, so it becomes 0
(0 == (0 )) + (0 ) // 0 == 1 is false, so it becomes 0
(1 ) + (0) // 0 == 0 is true, so it becomes 1
1 // 1 + 0 is 1