>我在Visual Studio 2012中使用C++(不是C++/CLI)。
我不明白为什么这段代码有效,我本来希望它在编译时失败,但它在运行时甚至不会失败:
double MyClass::MyMethod() const
{
//some code here
return (10, 20, 30, 40);
}
我错误地生成了这段代码,不是故意的,我在运行单元测试时注意到了这个错误。我很惊讶它有效。当我运行它时,它返回 40,列表中的最后一个数字。
有人可以解释一下这种语法的含义以及为什么有效吗?
这是使用逗号运算符,它将从左到右计算每个表达式,但只返回最后一个表达式。如果我们看一下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);
^
然后还有两个。
号运算符是C++中的"序列点",通常用于初始化for
循环中的多个变量。
因此,代码将一系列整数(一次一个)作为单个表达式进行评估。最后一个是返回值,return 语句作为一个整体等价于简单的return (40);
表达式(10, 20, 30, 40)
实际上是由 ,
分隔的一系列 4 个表达式 您可以使用,
分隔多个表达式,结果是最后一个表达式的求值。
您已经使用了逗号运算符,
即逗号运算符
return ()
是有效的。
return (/*valid evaluation*/)
也是如此
逗号运算符返回最后一个值,即40