章节目录

逗号运算符

本节阅读量:
运算符 符号 使用形式 结果
逗号 , x, y 分别计算x与y,然后返回y求值的结果

逗号运算符(,)让我们在允许单个表达式的地方可以编写多个表达式。逗号运算符计算左操作数,然后计算右操作数,最后返回右操作数的结果。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#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)的结果,随后将其打印到控制台。

请注意,逗号在所有运算符中的优先级最低,甚至低于赋值。因此,以下两行代码执行不同的操作:

1
2
z = (a, b); // 首先计算 (a, b) 得到b的值, 将结果赋值给 z.
z = a, b; // 计算过程是 "(z = a), b", 所以 z 拿到的是 a 的值, 然后计算b,丢弃b的求值结果。

这使得逗号运算符的使用有些危险。

在几乎所有情况下,使用逗号运算符编写的语句最好拆开为单独的语句。例如,上述代码可以编写为:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <iostream>

int main()
{
    int x{ 1 };
    int y{ 2 };

    ++x;
    std::cout << ++y << '\n';

    return 0;
}

大多数程序员根本不使用逗号操作符,唯一的例外是for循环中。我们将在以后介绍for语句。


逗号作为分隔符

在C++中,逗号符号通常用作分隔符,这些用法不会调用逗号运算符。分隔符逗号的一些示例:

1
2
3
4
5
void foo(int x, int y) // 逗号用来区分函数中的不同参数
{
    add(x, y); // 逗号用来区分函数调用中的不同参数
    constexpr int z{ 3 }, w{ 5 }; // 逗号用来分隔同一语句中的变量声明 (不要这样写)
}

没有必要避免使用分隔符逗号(除非是在同一语句里声明多个变量时)。


6.3 自增/自减运算符和副作用

上一节

6.5 关系运算符和浮点比较

下一节