我在 Visual Studio 2012 中的 C ++ (不是C ++ / CLI)工作。
我不明白为什么这段代码有效,我原以为它会在编译时失败,但它在运行时甚至都不会失败:
double MyClass::MyMethod() const
{
//some code here
return (10, 20, 30, 40);
}
我错误地制作了这段代码,不是故意的,我在运行单元测试时注意到了这个错误。我很惊讶它有效。当我运行它时,它会返回 40 ,这是列表中的最后一个数字。
有人可以解释一下这种语法的含义及其工作原理吗?
答案 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)