逗号运算符
逗号运算符 (Comma operator) 的形式为 E1, E2。
它会先求值 E1,丢弃 E1 的结果值,然后再求值 E2,并把 E2 的结果作为整个表达式的结果。
1. 最关键的性质:有确定的求值顺序
E1 的求值(包含其副作用)在 E2 之前完成。也就是说,逗号运算符在标准层面提供了一个明确的“先后关系”。
2. 示例
c
#include <stdio.h>
int main(void) {
int i = 0;
int x = (i++, i + 10);
printf("i = %d, x = %d\n", i, x);
return 0;
}1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
3. 与“逗号”分隔列表的区别
注意区分:
- 逗号运算符:
(a, b)这类表达式; - 逗号作为分隔符:例如函数实参列表
f(a, b)、初始化器列表{a, b}、枚举列表enum { A, B }。
它们不是同一个语法成分,也不共享相同的求值顺序规则。
4. 使用建议
逗号运算符在实践中通常不推荐滥用,因为它会降低可读性。更清晰的写法往往是:拆成两行。
例外
逗号运算符偶尔会被用于把“多步更新”写成一个表达式,但它会降低可读性。初学阶段建议尽量拆成多行写清楚。
5. 习题
#10418
⚡4⏳2
解释下面程序的输出:
c
int i = 0;
int x = (i += 2, i *= 3);1
2
2