What is &&& operation in C

C++COperatorsCompiler OptimizationGcc Warning

C++ Problem Overview


#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 astrue’ [-Waddress]

How is c being evaluated in the above program?

C++ Solutions


Solution 1 - C++

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’

Solution 2 - C++

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionmanav m-nView Question on Stackoverflow
Solution 1 - C++Luchian GrigoreView Answer on Stackoverflow
Solution 2 - C++Keith ThompsonView Answer on Stackoverflow