2

如果一个表达式计算多个&&运算符,并且不计算任何较低优先级的运算符(例如||, ?:),那么只要其中一个&&s 返回 0,表达式就会计算为 0,还是会完成对剩余&&s 的计算?

例如,

q=0; w=1; e=1; r=1;
if(q && w && r && e) {}

if()一旦评估为 0,这是否会评估为 false(因为无论右手运算符如何, q && w其余部分都必须全部评估为 0)?&&

4

3 回答 3

5

是的,只要遇到错误的表达式,评估就会提前终止(“短路”)。对此有一个例外:如果&&运算符已针对相关类型的参数进行了重载。强烈建议不要这样做,而且极为罕见,但可能会发生。

于 2011-08-25T19:25:17.887 回答
4

是的,它确实对内置类型进行短路评估。您已经重载&&||不会执行短路的自定义类型,这可能会导致细微的错误。

于 2011-08-25T19:23:17.457 回答
2

其他人已经给出了答案(即“是”)。

我将回答添加一个特别惯用的用法示例:

if ((p != NULL) && (*p == 42))
{
    /* Do something */
}

如果没有发生短路,这将不得不以更笨拙的方式编写。

请注意,您也可以以 Perl 风格的方式使用它,例如:

someCondition && doSomething();

所以只有在is时doSomething()才会被调用。但这仅在返回可转换为的类型时才编译,并且不被视为惯用的 C++。(另请注意,此技术不能在 C 中编译。)someConditiontruedoSomething()bool

于 2011-08-25T19:28:29.820 回答