操作符 | 符号 | 形式 | 操作 |
---|---|---|---|
逗号 | , | x, y | 先求值 x 再求值 y ,返回 y 的值 |
逗号操作符 (,
) 允许你在任何允许单个表达式的地方求值多个表达式。逗号操作符先求值其左操作数,然后求值其右操作数,最后返回右操作数的结果。
例如:
#include <iostream>
int main()
{
int x{ 1 };
int y{ 2 };
std::cout << (++x, ++y) << '\n'; // 先递增 x 和 y,整个表达式取右操作数的结果
return 0;
}
首先,逗号操作符的左操作数被求值,将 x
从 1
递增到 2
。接着,右操作数被求值,将 y
从 2
递增到 3
。逗号操作符返回右操作数的结果 (3
),该结果随后被打印到控制台。
请注意,逗号在所有操作符中具有最低的优先级,甚至低于赋值操作符。因此,以下两行代码执行的操作是不同的:
z = (a, b); // 先求值 (a, b) 得到 b 的结果,然后将该值赋给变量 z。
z = a, b; // 解析为 "(z = a), b",因此 z 被赋值为 a,然后 b 被求值但其结果被丢弃。
这使得逗号操作符的使用有一定危险性。
在几乎所有的场景下,使用逗号操作符编写的语句,如果拆分成单独的语句会更好。例如,上面的代码可以改写成:
#include <iostream>
int main()
{
int x{ 1 };
int y{ 2 };
++x;
std::cout << ++y << '\n';
return 0;
}
大多数程序员根本不会使用逗号操作符,唯一的例外是在 for
循环内部,这种情况比较常见。我们将在未来的课程 [8.10 – For 语句] 中讨论 for
循环。
最佳实践 (Best practice)
避免使用逗号操作符,除非在
for
循环内部。
逗号作为分隔符 (Comma as a separator)
在 C++ 中,逗号符号经常用作分隔符 (separator),这些用法不会触发逗号操作符的功能。一些分隔符逗号的例子:
void foo(int x, int y) // 分隔符逗号:用于分隔函数定义中的参数
{
add(x, y); // 分隔符逗号:用于分隔函数调用中的实参
constexpr int z{ 3 }, w{ 5 }; // 分隔符逗号:用于分隔同一行定义的多个变量(不要这样做)
}
没有必要避免使用分隔符逗号(除非在声明多个变量时,这种情况本身就不应该做)。