如果一个表达式计算多个&&
运算符,并且不计算任何较低优先级的运算符(例如||
, ?:
),那么只要其中一个&&
s 返回 0,表达式就会计算为 0,还是会完成对剩余&&
s 的计算?
例如,
q=0; w=1; e=1; r=1;
if(q && w && r && e) {}
if()
一旦评估为 0,这是否会评估为 false(因为无论右手运算符如何, q && w
其余部分都必须全部评估为 0)?&&
如果一个表达式计算多个&&
运算符,并且不计算任何较低优先级的运算符(例如||
, ?:
),那么只要其中一个&&
s 返回 0,表达式就会计算为 0,还是会完成对剩余&&
s 的计算?
例如,
q=0; w=1; e=1; r=1;
if(q && w && r && e) {}
if()
一旦评估为 0,这是否会评估为 false(因为无论右手运算符如何, q && w
其余部分都必须全部评估为 0)?&&
是的,只要遇到错误的表达式,评估就会提前终止(“短路”)。对此有一个例外:如果&&
运算符已针对相关类型的参数进行了重载。强烈建议不要这样做,而且极为罕见,但可能会发生。
是的,它确实对内置类型进行短路评估。您已经重载&&
或||
不会执行短路的自定义类型,这可能会导致细微的错误。
其他人已经给出了答案(即“是”)。
我将回答添加一个特别惯用的用法示例:
if ((p != NULL) && (*p == 42))
{
/* Do something */
}
如果没有发生短路,这将不得不以更笨拙的方式编写。
请注意,您也可以以 Perl 风格的方式使用它,例如:
someCondition && doSomething();
所以只有在is时doSomething()
才会被调用。但这仅在返回可转换为的类型时才编译,并且不被视为惯用的 C++。(另请注意,此技术不能在 C 中编译。)someCondition
true
doSomething()
bool