C中的&&&操作是什么?
#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
?
这是c = i && (&i);
,第二部分是多余的,因为&i
永远不会评价为false
。
对于一个用户自定义的types,实际上可以重载一元运算operator &
,它可能会不同,但这仍然是一个非常糟糕的主意 。
如果你打开警告 ,你会得到像这样的东西:
警告:“我”的地址将始终评估为“真”
C中没有&&&
运算符或标记,但是&&
(逻辑“和”)和&
(一元地址 – 或者按位“和”)运算符确实存在。
由最大的蒙克规则,这:
c = i &&& i;
相当于这个:
c = i && & i;
如果i
和&i
都为真,则将c
设置为1,如果其中任何一个为假,则将其设置为0。
对于一个int,任何非零值是真的。 对于一个指针,任何非null值都是true(并且对象的地址总是非空的)。 所以:
它将c
设置为1,如果i
不是零,或者如果i
等于零,则设置为0。
这意味着&&&
在这里被用于故意混淆。 该任务也可以是以下任一项:
c = i && 1; c = !!i; c = (bool)i; // C++ or C with <stdbool.h> c = i ? 1 : 0; /* C */ c = i ? true : false; // C++