返回括号之间的值列表(10,20,30,40)?

Dzy*_*ann 4 c++ comma-operator

我在Visual Studio 2012中使用C++(而不是C++/CLI).

我不明白为什么这段代码有效,我原本以为它会在编译时失败,但它在运行时甚至都不会失败:

double MyClass::MyMethod() const
{
    //some code here        
    return (10, 20, 30, 40);
}
Run Code Online (Sandbox Code Playgroud)

我错误地制作了这段代码,不是故意的,我在运行单元测试时注意到了这个错误.我很惊讶它有效.当我运行它时,它返回40,列表中的最后一个数字.

有人能解释一下这种语法的含义及其工作原理吗?

Sha*_*our 9

这是使用逗号运算符,它将从左到右评估每个表达式,但只返回最后一个.如果我们查看草案C++标准部分的5.18 逗号运算符,它会说:

用逗号分隔的一对表达式从左到右进行评估; 左表达式是废弃的值表达式(第5条).83在与右表达式相关的每个值计算和副作用之前,对与左表达式相关联的每个值计算和副作用进行排序.

链接文章最常见的用途是:

允许多个赋值语句而不使用块语句,主要是在for循环的初始化和增量表达式中.

这个以前的线程C逗号运算符的使用有一些非常有趣的例子,说明如果你真的很好奇,人们如何使用逗号运算符.

启用警告这总是一个好主意可能帮助你在这里,在gcc使用中-Wall我看到以下警告:

warning: left operand of comma operator has no effect [-Wunused-value]
  return (10, 20, 30, 40);
              ^
Run Code Online (Sandbox Code Playgroud)

然后还有两个.

  • / Wall通常没用,因为它实际上启用了所有警告(在其他一些编译器上,/ Wall只启用"有用"警告;对于Visual C++,/ W4执行此操作).您应该使用/ W4,然后启用您关心的特定警告.你可以使用[/ w选项](http://msdn.microsoft.com/en-us/library/thxezb7y.aspx)启用个别警告,例如cl/W4/w44548将启用警告4548(你是一个警告)寻找)警告级别4. (2认同)