#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;
}
The output of the above program compiled using gcc
is
0
1
1
With the -Wall
or -Waddress
option, gcc
issues a warning:
warning: the address of ‘i’ will always evaluate as ‘true’ [-Waddress]
How is c
being evaluated in the above program?
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:
is equivalent to this:
It sets
c
to 1 if bothi
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 ifi
is non-zero, or to0
ifi
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:It's
c = i && (&i);
, with the second part being redundant, since&i
will never evaluate tofalse
.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: