Я работаю над проектом, и я продолжаю находить такие строки, как этот:
if(pointer && pointer->whatever) {...}
Можно ли предположить, что if
будет проводить сравнения в том же порядке, что и в исходном коде? Или может случиться, что pointer->wathever
оценивается раньше (или одновременно) с проверкой pointer
на NULL?
Да, это безопасное выражение. Условные &&
и ||
выполняются короткозамкнутым способом в C.
Если pointer
равен NULL
тогда pointer->whatever
что не будет выполнено.
C
но для C++
это верно только тогда, когда ||
или &&
используется
Порядок оценки (для C и C++) оператора &&
- слева направо. Следовательно, указатель всегда будет проверяться перед любыми последующими утверждениями. Любые последующие операторы не будут оцениваться, если указатель оценивается как false (short-circuiting).
if(pointer && pointer->whatever)
Это похоже на письмо:
if(pointer) {
if(pointer->whateve) {
}
}
Так да. Читайте об оценке короткого замыкания.
Логические выражения оцениваются Left-to-right
и как только результат становится окончательным, он перестает оценивать другие выражения. Поэтому, если pointer
выражения if false
, pointer->whatever
что не будет оценено. Таким образом, это абдолитно стерически, чтобы использовать его так же, как и вы.
f() && g() && h()
интерпретируется как (f() && g()) && h()
без каких-либо гарантий относительно того, какая функция вызывается первой. Порядок оценки дает гарантии на этот счет. Но порядок оценки слева направо не гарантирует, что правый операнд не оценивается, если левый уже определил результат. Это называется коротким замыканием.