Почему (0

#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  )