如何评估'if(A && B)'语句?

Buc*_*pus 18 c++

if( (A) && (B) )
{
  //do something
}
else
  //do something else
Run Code Online (Sandbox Code Playgroud)

问题是,如果A为FALSE,该语句是否会立即中断.B会被评估吗?

我问这个情况,当数组实际上是空的并且元素为零时,B检查数组索引的有效性就说数组[0].因此我们尝试访问超出数组范围的内容,因此抛出了一个段错误.特别

if( (array.GetElements() > 0) && (array[0]))
  array[0]->doSomething();
else
  //do nothing and return
Run Code Online (Sandbox Code Playgroud)

如果array [0]实际得到了评估,这可能会很危险,因为它会在没有第一次检查的情况下在"&&"的左侧进行段错误.优先级告诉我,左侧肯定会优先,但它并没有告诉我,如果左边是假,它将不会评估右侧.

Joh*_*kin 46

在C和C++中,&&||运算符"短路".这意味着他们只在需要时评估参数.如果第一个参数to &&为false,或者第一个参数||为true,则不会评估其余参数.

您发布的代码是安全的,但我质疑您为什么要包含空else块.

  • 我想补充说,如果你重载运算符&&或|| 在你自己的班上,他们不再短路了.要记住的事情. (10认同)
  • @Kristo,我不知道!但是,我认为没有任何理智的情况可以超载该运营商.我认为重载bool强制转换操作符会更有用. (2认同)

str*_*ger 11

您询问的是&&运营商,而不是if声明.

&& 短路,意味着如果在工作时遇到只导致一个答案的条件,它将停止工作并使用该答案.

因此,0 && x将执行0,然后终止,因为无论第二个参数是什么,表达式都无法计算非零值&&.