#c #c #if-statement #logical-operators #equals-operator
Вопрос:
В моем if
утверждении первое условие для amp;amp;
is 0
(false), поэтому выражение 0 amp;amp; (a )
равно 0
, верно? Тогда 0==0
это должно быть правдой. Зачем я else
сюда добираюсь? Пожалуйста, объясните!
int a=0;
if(0 amp;amp; (a )==0)
{
printf("Inside if");
}
else
{
printf("Else");
}
printf("%i",a);
Комментарии:
1. Сначала
a
значение равно 0, аa
затем увеличивается. Но даже если оно оценивается как ненулевое значение,==
связывается сильнее, чемamp;amp;
(имеет более высокий приоритет), поэтому ваше выражение эквивалентно0 amp;amp; ((a ) == 0)
, что является ложным независимо от того, что(a ) == 0
оценивается.2. Приоритет
==
выше, чемamp;amp;
. Добавьте круглые скобки(0 amp;amp; (a ))==0
3. Теперь, когда у вас есть ответ, я рекомендую пересмотреть ваш вопрос. Вы видите, где ваша логика подвела вас? (В одном отношении это интересный вопрос, потому что ваши выводы буквально верны, но в конечном итоге они неприменимы.)
4.
if(0 amp;amp; (a )==0)
это ужасный код, и он должен провалить любой обзор кода. Код, который заставляет вас искать таблицы приоритетов, совершенно неверен. В конечном итоге вы испортите написание такого кода, даже если считаете, что у вас идеальная память (подсказка: никто этого не делает…). Очень простое эмпирическое правило: если не слишком очевидно, что делает строка кода, это неправильно .
Ответ №1:
==
Оператор имеет более высокий приоритет, чем amp;amp;
оператор, поэтому эта строка:
if(0 amp;amp; (a )==0)
с ним обращаются так:
if( 0 amp;amp; ((a )==0) )
Таким образом, все выражение под if
этим является ложным и a
даже не оценивается из-за короткого замыкания amp;amp;
оператора.
Вы можете прочитать о приоритете операторов и ассоциативности на cppreference.com.
Если вы сомневаетесь, вам следует использовать круглые скобки, чтобы четко выразить свое намерение. В этом случае это должно быть:
if( (0 amp;amp; (a )) == 0 )
Хотя это не имеет никакого смысла, так как здесь оно всегда равно true
и a
не увеличивается.
Комментарии:
1. Обратите внимание, что даже в исправленной версии a никогда не будет выполняться.
Ответ №2:
Как уже упоминалось, приоритет ==
выше , чем приоритет amp;amp;
, поэтому оператор преобразуется в
if( 0 amp;amp; ((a )==0))
Однако, все равно, даже если вы добавите правильный порядок скобок , a
возвращается исходное значение a
, которое есть 0
, но a
оно увеличивается. Если вы хотите вернуть обновленное значение a
, вам следует написать a
if( (( a) amp;amp; 0) == 0 )