可能重复:
double negation in C : is it guaranteed to return 0/1?
int main(void)
{
int i = 2, j = 1;
printf("%d", !!i +!j);
return 0;
}
据我了解,!!将表达式转换为bool,所以它是说因为我不等于2,所以值为0 + j,不等于1,值为0,并且因为0等于false,所以它读取:false + false = true代表值1.请帮助我是C编程的新手。
答案 0 :(得分:7)
C没有布尔类型(好吧,C99和更新版本,但程序中没有任何内容可以使用它)。
!
只是一个一元运算符,可将0
转换为1
,将其他任何内容转换为0
。因此,在您的情况下,由于i
为2
,!i
为0
,!!i
为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;
}
答案 1 :(得分:2)
!x
为真(即不等于0),则 x
为0;如果x
为假(即等于0),则为{1>。由于您的示例i
为2,!i
将为0,因此!!i
将为1.同样!j
将为0.因此表达式的结果将为{{ 1}}。
请注意,1 + 0 = 1
(即false + false)不等于1。
答案 2 :(得分:0)
以下是规范关于!
运算符的说明(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