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++