可能重复:
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. 所以在你的情况下,因为iis 2、!iis0和!!iis 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,因此将为!i0,因此!!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