【问题标题】:C++: Logical Comparison as conditional statement?C++:逻辑比较作为条件语句?
【发布时间】:2011-11-27 13:31:33
【问题描述】:

遇到了一些使用它的代码,这让我感到疑惑。

if(condition) foo = bar();

condition && (foo = bar());

这两段代码是否等同于编译器?如果不是,它们会在哪些方面有所不同?

【问题讨论】:

标签: c++ obfuscation


【解决方案1】:

由于运算符优先级,后者被解释为:

(condition && foo) = bar();

此外,&& 有可能被超载,这可能导致几乎任何事情。

简而言之:它们根本不相等——至少在一般情况下是这样。

【讨论】:

  • 啊,没错!不过那是我的错误,括号出现在我看到的代码中。修复了问题
【解决方案2】:

除非 condition && foo 评估为 左值 ,否则 condition && foo = bar(); 是没有意义的。

【讨论】:

  • 对不起,我忽略了括号,已更正。
【解决方案3】:

存在编译器错误:左值无效。要拥有相同的功能,您必须使用

conticion ? foo = bar( ) : <other accion>;

【讨论】:

    【解决方案4】:

    第一个版本只是一个简单的旧声明。

    第二个版本是一个表达式,它将返回整个表达式的结果。这可能会允许一些棘手的单行语法,像往常一样,这可能会使代码更具可读性,但更有可能由于不熟悉而使其更复杂且更难快速解析。

    IMO 要么在任何地方始终如一地使用它,以便代码的读者习惯它,要么根本不使用它。

    【讨论】:

      【解决方案5】:

      除非&amp;&amp;conditionfoo 类型的组合而重载,否则它们将具有相同的行为 - 后者将以这种方式工作:

      bool result;
      if( !condition ) {
           result = false;
      } else {
           foo = bar();
           result = foo != 0;
      }
      and result gets ignored
      

      这是通常的短路 - 如果&amp;&amp; 的第一个组件是false,则第二个组件不会被评估。

      IMO 第二种变体的可读性要差得多。

      【讨论】:

        【解决方案6】:

        如果 && 对于条件和 foo 都没有重载:

        condition && (foo = bar());
        

        将被视为

        (condition.operator bool()) && (foo = bar());
        

        如果 (condition.operator bool()) 不成立,则 (foo = bar()) 不会被执行,反之亦然。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-24
          • 2020-03-22
          • 1970-01-01
          • 2015-09-19
          • 1970-01-01
          • 1970-01-01
          • 2021-12-08
          • 2019-08-15
          相关资源
          最近更新 更多