#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++
c
operators
compiler-optimization
gcc-warning
Манав мн
источник
источник
i && (&i)
? Интересно, что я не могу найти повторяющийся пост на SO.while (i &&& i <-- j) {}
,Ответы:
Это
c = i && (&i);
, со второй частью, излишней, так&i
как никогда не будет оцениватьfalse
.Для пользовательского типа, где вы можете перегружать унарный код
operator &
, он может отличаться, но это все еще очень плохая идея .Если вы включите предупреждения , вы получите что-то вроде:
источник
c = i & (&&i);
; Гдеi
какой-то ярлык?i
определяется какint
и в вопросе нет меток. Кроме того, максимальный&&
оператор для получения адреса метки в любом случае является нестандартным расширением gcc. Но даже если бы оно было стандартным, правило максимального значения munch не позволило бы выполнить его анализ таким образом (если вы не вставите пробел).&i
можете оценитьfalse
. Его используют иногда по умолчанию. Пример:void fn(type& x = *reinterpret_cast<type*>(NULL));
какое значение&x
вfn
iffn
вызывается без параметров? Это 0 ака ложь. Однако, используя описанный способ, это всегда будет верно, еслиi == 0
, и если бы кто-то использовал его, как я описал, это было бы такc = &i && i
.В
&&&
Си нет оператора или токена. Но операторы&&
(логические «и») и&
(унарный адрес или побитовый «и») существуют.По правилу максимального жаворонка это:
эквивалентно этому:
Устанавливается
c
в 1, если обаi
и&i
истинны, и в 0, если любой из них ложен.Для типа int любое ненулевое значение имеет значение true. Для указателя любое ненулевое значение является истинным (а адрес объекта всегда ненулевым). Так:
Он устанавливается
c
в 1, еслиi
не равен нулю, или в0
случае, еслиi
равен нулю.Что подразумевает, что
&&&
это используется здесь только для преднамеренного запутывания. Назначение может также быть любым из следующего:источник