我正在开展一个项目,我一直在寻找像这样的行:
if(pointer && pointer->whatever) {...}
假设if
将按照源代码中描述的相同顺序进行比较是否安全?或者可能发生pointer->wathever
在pointer
对NULL检查之前(或同时)进行评估的情况?
答案 0 :(得分:4)
是的,这是一个安全的声明。条件&&
和||
以short-circuit方式在C中执行。
如果pointer
为NULL
,那么pointer->whatever
将被执行。
答案 1 :(得分:2)
&&
运算符的求值顺序(对于C和C ++)从左到右。因此,指针将始终在任何后续语句之前进行测试。如果指针被评估为false(短路),则不会评估以下任何语句。
答案 2 :(得分:1)
if(pointer && pointer->whatever)
就像写作:
if(pointer) {
if(pointer->whateve) {
}
}
所以,是的。阅读有关短路评估的内容。
答案 3 :(得分:0)
逻辑表达式从Left-to-right
开始计算,一旦结果变得明确,它就会停止评估其他表达式。因此,如果pointer
表达式false
,pointer->whatever
将不会被评估。因此,像你一样使用它是非常安全的。