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

13446 次浏览

It's c = i && (&i);, with the second part being redundant, since &i will never evaluate to false.

For a user-defined type, where you can actually overload unary operator &, it might be different, but it's still a very bad idea.

If you turn on warnings, you'll get something like:

warning: the address of ‘i’ will always evaluate as ‘true’

There is no &&& operator or token in C. But the && (logical "and") and & (unary address-of or bitwise "and") operators do exist.

By the maximal munch rule, this:

c = i &&& i;

is equivalent to this:

c = i && & i;

It sets c to 1 if both i and &i are true, and to 0 if either of them is false.

For an int, any non-zero value is true. For a pointer, any non-null value is true (and the address of an object is always non-null). So:

It sets c to 1 if i is non-zero, or to 0 if i is equal to zero.

Which implies that the &&& is being used here just for deliberate obfuscation. The assignment might as well be any of the following:

c = i && 1;
c = !!i;
c = (bool)i;          // C++ or C with <stdbool.h>
c = i ? 1 : 0;        /* C */
c = i ? true : false; // C++