在 && 语句的后半部分进行无效操作是否安全?

Is it safe to have an invalid operation in the second half of && in an if statement?

本文关键字:操作 无效 是否 安全 语句 后半部      更新时间:2023-10-16

这安全吗:

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

如果精灵>边数可以 == 0?

我问的原因是,如果我像这样构建if语句:

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

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

是的,它很安全。标准保证短路

这意味着如果 and (&&) 表达式的第一部分计算结果为 false ,则保证不会计算第二部分。

从 C++03 - 5.14/1

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

只要

您谈论内置的&&运算符,它就是安全的。正如其他答案已经指出的那样,内置运算符的计算是短路的:左操作数总是首先计算,如果它计算为 false,则甚至不触及右操作数。

但是,当您处理重载运算符&&时,它的行为与任何其他重载二元运算符一样,这意味着两个操作数都被计算

是的,对于内置类型(如布尔值)。此行为称为短路。发生这种情况是因为 && 实际上是与表达式中的第一个语句关联的函数,尽管它也因其作为运算符的状态而具有特殊语法。在此函数中,通常会检查 null 以及表达式是否为 false。在 && 运算符的情况下,如果布尔值为 false,则这足以停止计算逻辑表达式,并节省计算时间。