【问题标题】:Two strings between brackets separated by a comma in C++ [duplicate]C ++中用逗号分隔的括号之间的两个字符串[重复]
【发布时间】:2012-08-07 14:22:34
【问题描述】:

可能重复:
C++ Comma Operator

我今天遇到了意想不到的(至少对我而言)C++ 行为,如下所示:

#include <iostream>

int main()
{
  std::cout << ("1", "2") << std::endl;

  return 0;
}

输出:

2

这适用于括号之间的任意数量的字符串。在 Visual Studio 2010 编译器和键盘上测试。

我想知道为什么这首先会编译,这个“功能”有什么用?

【问题讨论】:

标签: c++ string comma parentheses


【解决方案1】:

啊,这是逗号运算符。当您使用逗号和两个(或更多)表达式时,会发生所有表达式都被执行的情况,结果作为一个整体是最后一个表达式的结果。这就是为什么你得到“2”的原因。请参阅here 以获得更大的解释。

【讨论】:

    【解决方案2】:

    逗号运算符计算逗号两边的表达式,但返回第二个的结果。

    【讨论】:

      【解决方案3】:

      逗号运算符 (, ) 逗号运算符 (,) 用于分隔两个或多个表达式,这些表达式包含在只需要一个表达式的情况下。当必须对一组表达式求值时,只考虑最右边的表达式。

      例如下面的代码:

      a = (b=3, b+2);
      

      参考:http://www.cplusplus.com/doc/tutorial/operators/

      【讨论】:

      • 至关重要的是,逗号操作符引入了一个序列点,保证从左到右的每个表达式都按顺序执行,所以b=3肯定会在b+2开始之前执行(至少从可观察行为的视角)。
      • 完全正确。在这种情况下,a = 5,b = 3。
      【解决方案4】:

      逗号 (",") 的结果是右子表达式。 我在 stl 容器的循环中使用它:

      for( list<int>::iterator = mylist.begin(), it_end = mylist.end(); it != it_end; ++it )
        ...
      

      【讨论】:

      • 除非您的示例中没有逗号运算符。
      • @JamesKanze 我认为他在第一个迭代器声明和it_end 的类型声明之后缺少变量名,但它们用逗号分隔......
      • 它们确实是用逗号分隔的,但我认为詹姆斯的意思是这个逗号不是“运算符逗号”,而是变量声明列表的一部分。詹姆斯,谢谢你指出,我会读一下。
      • @AlexanderChertov 没错。大多数逗号不是运算符,而是通用语法的一部分。区别非常重要;如果重载逗号运算符,则仅在逗号实际上是运算符的上下文中才会考虑重载。 (除非您的目标是混淆,否则重载逗号运算符并不是一个好主意。)
      【解决方案5】:

      称为逗号运算符:在表达式x, y 中,编译器 首先评估x(包括所有副作用),然后评估y;结果 表达式的结果是y

      在你引用的表达中,它绝对没有用;第一个字符串 被简单地忽略了。但是,如果第一个表达式有副作用, 它可能很有用。 (在我看来,主要是为了混淆,它是 最好避免。)

      还要注意,这仅在逗号是运算符时才有效。如果可以 可以是其他任何东西(例如,分隔 a 的参数的标点符号 函数),它是。所以:

      f( 1, 2 );      //  Call f with two arguments, 1 and 2
      f( (1, 2) );    //  Call f with one argument, 2
      

      (看。我告诉过你它有利于混淆。)

      【讨论】:

      • “在我看来,主要是为了混淆,最好避免” - 一个经典且合理的用法是修改 for 循环中的多个变量,例如for (; x &gt; y; x--, y++) ...
      • @TonyDelroy 我确实说过大部分。我不确定在您的站点中我是否不喜欢while 循环,但这肯定是可以接受的情况。另一个“广泛”的用途是在宏中,它可用于使两个语句显示为单个函数调用,或“强制”一个 void 函数(例如,abort 为给定类型,以便它可以使用在三元运算符中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 2015-08-11
      相关资源
      最近更新 更多