C语言补漏-逗号运算符与逗号表达式
1. 新名词?
今天看到一个新名词: 逗号表达式。 C语言就有。额,怎么当时学习C没见过,一头雾水。 对我来说是新名词,其实它早就存在了,只是我还不知道。
2. 逗号表达式
C语言提供了逗号运算符----一种特殊的运算符。 形如:
表达式1,表达式2
这里,其将两个表达式连接起来,类似这样的表达式被称为逗号表达式, 比如: a+b, 3+3。
3. 解析过程
形式: 表达式1,表达式2
先计算表达式1的结果,再计算表达式2的结果。既然整体是逗号表达式,他肯定有个结果,那么他的结果是表达式2,与表达式1的结果无关。例如:
int a = 1; // (1)
a = (a = 2 * 5, a * 4); // (2)
std::cout << "a = " << a << std::endl; // (3)
首先(1)中,a=1, (2)中,(a = 2 * 5, a * 4)是一个逗号表达式,(2)整体是一个赋值表达式。(2)的计算过程:先计算 a=2*5, 再将10(2*5)赋值给a, 此时,a = 10, 最后计算表达式2 a * 4的结果,a = 10, a * 4 = 40。逗号表达式的结果为40,最终将40赋值给a,a最终等于40.
4.优先级
逗号运算符是一种特殊的运算符,其优先级为最低。看下面的例子:
例A
a = (a = 2 * 5, a * 4);
例B
a = 2 * 5, a * 4;
例A与例B的区别是,例A是一个赋值表达式,例子B是一个逗号表达式。
5.扩展
扩展形式: 表达式1,表达式2,表达式3......表达式X
整体计算结果为最后一个表达式X的值。
一个例子
int a = 1;
a = (a = 2 * 5, a * 4, a + 1, a + 2, a + 3);
cout << "a = " << a << endl;
按照规则,整体是一个赋值表达式,其中,=右边的逗号表达式的最终结果为 a+3,而a = 2 * 5 = 10, 所以,赋值表达式计算结果: a = 13