#include <stdio.h>
volatile int i;
int main()
{
int c;
for (i = 0; i < 3; i++)
{
c = i &&& i;
printf("%d\n", c);
}
return 0;
}
使用gcc
编译的上述程序的输出是
0
1
1
使用-Wall
或-Waddress
选项,gcc
会发出警告:
warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]
如何在上述计划中评估c
?
答案 0 :(得分:270)
它是c = i && (&i);
,第二部分是多余的,因为&i
永远不会评估为false
。
对于用户定义的类型,您实际上可以重载一元operator &
,它可能会有所不同,但它仍然是非常糟糕的主意。
如果你打开警告,你会得到类似的内容:
警告:“i”的地址将始终评估为“true”
答案 1 :(得分:118)
C中没有&&&
运算符或标记。但是&&
(逻辑“和”)和&
(一元地址或按位“和”)运算符确实存在
根据maximal munch规则:
c = i &&& i;
相当于:
c = i && & i;
如果c
和i
都为真,则将&i
设置为1,如果其中任何一个为假,则将c
设置为0.
对于int,任何非零值都为true。对于指针,任何非null值都为true(并且对象的地址始终为非null)。所以:
如果i
非零,则会将0
设置为1;如果i
等于零,则设置为&&&
。
这意味着c = i && 1;
c = !!i;
c = (bool)i; // C++ or C with <stdbool.h>
c = i ? 1 : 0; /* C */
c = i ? true : false; // C++
仅用于故意混淆。作业也可以是以下任何一种:
{{1}}