【问题标题】: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() 只有在 someConditiontrue 时才会被调用。但这仅在 doSomething() 返回可转换为 bool 的类型时编译,并且它不被视为惯用的 C++。 (另请注意,这种技术不能在 C 中编译。)

        【讨论】:

          猜你喜欢
          • 2011-07-24
          • 2021-10-04
          • 2016-12-31
          • 2018-03-28
          • 1970-01-01
          • 1970-01-01
          • 2022-11-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多