4

这安全吗:

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

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

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

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

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

4

3 回答 3

8

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

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

从 C++03 - 5.14/1

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

于 2012-06-05T18:53:01.483 回答
4

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

However, when you are dealing with overloaded operator &&, it behaves as any other overloaded binary operator, meaning that both operands are evaluated.

于 2012-06-05T18:57:01.403 回答
2

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

于 2012-06-05T18:54:00.523 回答