#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
,
Для пользовательского типа, где вы можете перегружать унарный operator &
, это может быть по-другому, но это все еще очень плохая идея.
если ты включить предупреждения, вы получите что-то вроде:
предупреждение: адрес «я» всегда будет оцениваться как «правда»
Здесь нет &&&
оператор или токен в C. Но &&
(логическое «и») и &
(унарный адрес или битовые операторы «и») существуют.
Посредством максимальный хруст Правило, это:
c = i &&& i;
эквивалентно этому:
c = i && & i;
Это устанавливает c
до 1, если оба i
а также &i
истина, и до 0, если любой из них является ложным.
Для типа int любое ненулевое значение имеет значение true. Для указателя любое ненулевое значение является истинным (а адрес объекта всегда ненулевым). Так:
Это устанавливает 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++