&& amp;& amp;& amp;&在if语句中?

时间:2012-06-05 18:51:17

标签: c++

这是安全的吗?

if(sprite->numberOfSides !=0 && sprite->value%sprite->numberOfSides!=0)

如果sprite-> numberOfSides可以== 0?

我问的原因是,如果我将if语句框成这样:

if(sprite->value%sprite->numberOfSides!=0 && sprite->numberOfSides !=0)

我得到一个例外(因为你不能n%0)。将它转换为前一个语句可以正常工作,但在编译不同的设备时,我不希望遇到麻烦。

3 个答案:

答案 0 :(得分:8)

是的,这是安全的。 短路由标准保证。

这意味着如果和(&&)表达式的第一部分求值为false,则可以保证第二部分不会被评估。

来自C ++ 03 - 5.14 / 1

  

&&运算符组从左到右。 [...]如果第一个操作数为false,则不评估第二个操作数。

答案 1 :(得分:4)

只要您谈论内置&&运算符,它就是安全的。正如其他答案已经提到的那样,内置运算符的评估是短路的:左操作数总是先评估,如果评估为false,则右操作数甚至不会被触及。

但是,当您处理重载的运算符&&时,它的行为与任何其他重载的二元运算符一样,这​​意味着将对两个操作数进行求值。

答案 2 :(得分:2)

是的,适用于内置类型(如布尔值)。这种行为称为短路。这是因为&&实际上是一个与表达式中第一个语句相关联的函数,尽管它的特殊语法也因其作为运算符的状态而存在。在此函数内部,通常会检查是否为null,以及表达式是否为false。在&&&运算符,如果布尔值为假,则这是停止评估逻辑表达式的充分理由,并将导致节省的评估时间。