ЕСЛИ и порядок сравнений

0

Я работаю над проектом, и я продолжаю находить такие строки, как этот:

if(pointer && pointer->whatever) {...}

Можно ли предположить, что if будет проводить сравнения в том же порядке, что и в исходном коде? Или может случиться, что pointer->wathever оценивается раньше (или одновременно) с проверкой pointer на NULL?

  • 0
    Да, извините, я не смог найти его перед публикацией
  • 0
    Смотри здесь
Теги:
c++11

4 ответа

4
Лучший ответ

Да, это безопасное выражение. Условные && и || выполняются короткозамкнутым способом в C.

Если pointer равен NULL тогда pointer->whatever что не будет выполнено.

  • 0
    Не могу сказать о C но для C++ это верно только тогда, когда || или && используется
  • 0
    @qwm Я изменил его на те. Но я на самом деле не могу думать о других условных операторах инфикса в C ...
Показать ещё 3 комментария
2

Порядок оценки (для C и C++) оператора && - слева направо. Следовательно, указатель всегда будет проверяться перед любыми последующими утверждениями. Любые последующие операторы не будут оцениваться, если указатель оценивается как false (short-circuiting).

1
if(pointer && pointer->whatever) 

Это похоже на письмо:

if(pointer) {
   if(pointer->whateve) {

   }
} 

Так да. Читайте об оценке короткого замыкания.

  • 0
    Я думал, что компилятор может потенциально оптимизировать код таким образом, что это больше не будет выполняться
  • 0
    @ user815129, компилятор и даже процессор могут переупорядочивать операторы, если нет побочных эффектов. Таким образом, он может уже вычислить смещение памяти указателя -> как угодно, поскольку это само по себе не представляет проблемы. Однако он не должен обращаться к этой памяти до тех пор, пока не будет выполнено первое утверждение.
Показать ещё 7 комментариев
0

Логические выражения оцениваются Left-to-right и как только результат становится окончательным, он перестает оценивать другие выражения. Поэтому, если pointer выражения if false, pointer->whatever что не будет оценено. Таким образом, это абдолитно стерически, чтобы использовать его так же, как и вы.

  • 2
    Вы путаете ассоциативность, порядок оценки и короткое замыкание. Только левая ассоциативность означает, что f() && g() && h() интерпретируется как (f() && g()) && h() без каких-либо гарантий относительно того, какая функция вызывается первой. Порядок оценки дает гарантии на этот счет. Но порядок оценки слева направо не гарантирует, что правый операнд не оценивается, если левый уже определил результат. Это называется коротким замыканием.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню