4

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

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

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

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

有人可以解释一下这种语法的含义以及它为什么有效吗?

4

4 回答 4

9

这是使用逗号运算符,它将从左到右评估每个表达式,但只返回最后一个。如果我们查看C++ 标准部分的草案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);
              ^

然后是另外两个。

于 2013-11-15T12:44:18.830 回答
4

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

因此,代码将一系列整数作为单个表达式一次一个地求值。其中最后一个是返回值,整个return语句就相当于简单的return (40);

于 2013-11-15T12:45:11.003 回答
1

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

于 2013-11-15T12:44:51.393 回答
1

您使用了,ie逗号运算符

return ()已验证。

也是如此return (/*valid evaluation*/)

逗号运算符返回最后一个值,即40

于 2013-11-15T12:47:00.723 回答