【问题标题】:c++, evaluating expressions with multiple `&&`s and no operator of lower precedencec ++,评估具有多个`&&`的表达式并且没有较低优先级的运算符
【发布时间】:2011-11-03 23:47:54
【问题描述】:
如果一个表达式计算多个 && 运算符,并且不计算任何较低优先级的运算符(例如,||、?:),则表达式将在 &&s 之一时计算为 0返回 0,还是会完成对剩余的 &&s 的评估?
例如,
q=0; w=1; e=1; r=1;
if(q && w && r && e) {}
一旦q && w 评估为 0,此 if() 是否会评估为 false(因为其余的 && 必须全部评估为 0,而不管右手运算符如何)?
【问题讨论】:
标签:
c++
expression
evaluation
operator-precedence
expression-evaluation
【解决方案1】:
是的,只要遇到错误的表达式,评估就会提前终止(“短路”)。对此有一个例外:如果 && 运算符已针对相关类型的参数进行了重载。强烈建议不要这样做,而且极为罕见,但可能会发生。
【解决方案2】:
是的,它确实对内置类型进行短路评估。重载 && 或 || 的自定义类型不会执行短路,这可能会导致细微的错误。
【解决方案3】:
其他人已经说出了答案(即“是”)。
我将回答添加一个特别惯用的用法示例:
if ((p != NULL) && (*p == 42))
{
/* Do something */
}
如果没有发生短路,这将不得不以更笨拙的方式编写。
请注意,您也可以以 Perl 风格的方式使用它,例如:
someCondition && doSomething();
所以 doSomething() 只有在 someCondition 是 true 时才会被调用。但这仅在 doSomething() 返回可转换为 bool 的类型时编译,并且它不被视为惯用的 C++。 (另请注意,这种技术不能在 C 中编译。)