Подтвердить что ты не робот

Что такое &&& операция в 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 в вышеуказанной программе?

4b9b3361

Ответ 1

It c = i && (&i);, при этом вторая часть будет избыточной, поскольку &i никогда не будет оцениваться до false.

Для пользовательского типа, где вы действительно можете перегрузить унарный operator &, он может быть другим, но он все еще является очень плохой идеей.

Если вы включите предупреждения, вы получите что-то вроде:

предупреждение: адрес 'i всегда будет оцениваться как' true

Ответ 2

Нет оператора &&& или токена в C. Но существуют операторы && (логический "и" ) и & (унарные адреса или побитовые "и" ).

В соответствии с максимальным мэшем это:

c = i &&& i;

эквивалентно этому:

c = i && & i;

Он устанавливает c в 1, если оба i и &i являются истинными, а 0, если любое из них ложно.

Для int любое ненулевое значение истинно. Для указателя любое ненулевое значение истинно (и адрес объекта всегда не равен null). Итак:

Он устанавливает c в 1, если i отличен от нуля или до 0, если i равно нулю.

Это означает, что &&& используется здесь только для преднамеренной обфускации. Назначение также может быть любым из следующих:

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