6-5 逗号运算符
| Operator | Symbol | Form | Operation |
|---|---|---|---|
| Comma | , | x, y | Evaluate x then y, returns value of y |
逗号运算符comma operator (,) 允许在允许单个表达式的位置求值多个表达式。该运算符先求值左操作数,再求值右操作数,最终返回右操作数的求值结果。
例如:
#include <iostream>
int main()
{
int x{ 1 };
int y{ 2 };
std::cout << (++x, ++y) << '\n'; // increment x and y, evaluates to the right operand
return 0;
}

首先求值逗号运算符的左操作数,将x从1递增至2。接着求值右操作数,将y从2递增至3。逗号运算符返回右操作数的结果(3),该结果随后被打印至控制台。
需注意逗号运算符在所有运算符中具有最低优先级,甚至低于赋值运算符。因此以下两行代码会产生不同效果:
z = (a, b); // evaluate (a, b) first to get result of b, then assign that value to variable z.
z = a, b; // evaluates as "(z = a), b", so z gets assigned the value of a, and b is evaluated and discarded.
这使得逗号运算符的使用存在一定风险。
在绝大多数情况下,使用逗号运算符编写的语句都应拆分为独立语句。例如,上述代码可改写为:
#include <iostream>
int main()
{
int x{ 1 };
int y{ 2 };
++x;
std::cout << ++y << '\n';
return 0;
}
大多数程序员完全不使用逗号运算符,唯一的例外是在 for 循环内部,此时它的使用相当普遍。我们将在后续的第 8.10 节——for 语句中讨论 for 循环。
最佳实践
避免使用逗号运算符,for 循环内部除外。
逗号作为分隔符
在C++中,逗号符号常被用作分隔符,这些用法不会调用逗号运算符。分隔符逗号的示例如下:
void foo(int x, int y) // Separator comma used to separate parameters in function definition
{
add(x, y); // Separator comma used to separate arguments in function call
constexpr int z{ 3 }, w{ 5 }; // Separator comma used to separate multiple variables being defined on the same line (don't do this)
}
无需避免使用分隔符逗号(除非在声明多个变量时,而这种做法不应采用)。

浙公网安备 33010602011771号