也许是由于Perl的影响,我喜欢使用以下语法

condition && do_something();

代替
if ( condition )
{
  do_something();
}

(我知道我可以不用大括号就将后者排成一排,但这不是重点。)

我已经做了几项测试(如下),可以正常工作。
但是我在标准中找不到引用,说明它是合法的。
它可能暗示
  • 5.14逻辑AND运算符
  • 5.17赋值运算符
  • 6.4。选择语句

  • 但是我不太确定(我检查了C++ 98,很抱歉过时了,但是即使C标准也足够了)。

    注意:我确实意识到,为了起作用,最后一个表达式(do_something)也必须可转换为bool,这对于选择语句而言不是必需的。当然,这是一个严重的限制。

    所以问题是:
  • 完全合法吗?
  • 是否有理由不使用它?
  • 是否有可能的副作用(如优化导致意外结果)?

  • 抱歉,如果真的重复了,我什么也找不到,但是可能是因为我没有使用正确的关键字。
    #include <cassert>
    
    bool sayYes()
    {
      return true;
    }
    
    bool sayNo()
    {
      return false;
    }
    
    int main( int args, char* argv[] )
    {
      bool a = true;
      bool b = false;
      int i = 0;
    
      a && ( i = 1 );
      assert( i == 1 );
    
      !a && ( i = 0 );
      assert( i == 1 );
    
      ( a || b ) && ( i = 0 );
      assert( i == 0 );
    
      sayYes() && ( i = 1 );
      assert( i == 1 );
    
      ( sayNo() || sayYes() ) && ( i = 0 );
      assert( i == 0 );
    
      return 0;
    }
    

    最佳答案

    这是完全合法的。来自[expr.log.and]:


    expr() && fun()等效于if (expr()) fun()(假设fun()返回可转换为bool的内容)。在编写复合条件表达式时,这是一个非常重要的属性。例如,只有在知道指针是有效的之后才对其进行引用:

    if (ptr && ptr->foo()) { ... }
    

    也就是说,如果您真正想要的是:
    if (expr()) {
        fun();
    }
    

    只是写那个。无论哪种方式,编译器都会生成相同的代码,但是您要执行的操作的意图会更加清晰。

    09-30 18:11
    查看更多