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

时间:2013-11-15 12:42:52

标签: c++ comma-operator

我在 Visual Studio 2012 中的 C ++ (不是C ++ / CLI)工作。

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

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

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

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

4 个答案:

答案 0 :(得分:9)

这是使用comma operator来评估从左到右的每个表达式,但只返回最后一个。如果我们查看draft C++ standard部分5.18 逗号运算符,它会说:

  

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

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

  

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

以前的帖子Uses of C comma operator有一些非常有趣的示例,说明如果您真的很好奇,人们如何使用逗号运算符

使用gcc-Wall使用warning: left operand of comma operator has no effect [-Wunused-value] return (10, 20, 30, 40); ^ 启用警告,这总是一个好主意可能对您有所帮助我看到以下警告:

{{1}}

然后又有两个。

答案 1 :(得分:4)

逗号运算符是C ++中的“序列点”,通常用于初始化for循环中的多个变量。

因此,代码一次一个地评估一系列整数,作为单个表达式。其中最后一个是返回值,返回语句整体上等同于return (40);

答案 2 :(得分:1)

表达式(10, 20, 30, 40)实际上是由,分隔的一系列4个表达式。您可以使用,分隔多个表达式,结果是对最后一个表达式的求值。

答案 3 :(得分:1)

您使用了,,即comma operator

return ()有效。

所以return (/*valid evaluation*/)

Comma operator返回最后一个值,即40