偶然间看到一个C程序,其中有一部分是这样的:
#include <stdio.h>
int main() {
int a = (100, 200);
printf("%d", a);
return 0;
}
当我看到这个表示方式的时候挺懵的,因为我确实不知道a的值为多少,因此我自己试了一下,发现答案是200。
为什么呢?
我一时真的没弄明白,于是查阅了很多资料,终于明白了其中的原理。
逗号表达式的运算级
逗号表达式的运算级是c语言中最低的,赋值运算符往往是一行程序中最后被执行的,但是可以看见上面的程序中给赋值运算符右边的表达式加了一个括号,目的就是为了提高逗号运算符的优先级。
任何一个表达式都有返回值
首先要明确的一点就是,任何一个表达式都有返回值,逗号表达式也不例外。
那逗号表达式的返回值是什么?
是他所连接的表达式最右侧的值。
这样一来就能解释的通了。
在上面的那个例子中,(100,200)被逗号表达式连接成为两个表达式,也就是相当于如下的效果:
100;
200;
然后返回最后一个表达式的值:200
为了加强理解我们再举一个例子:
#include <stdio.h>
int main() {
int a = 100;
int b = 200;
int c = (a * b, a + b, a * 2);
printf("%d", c);
return 0;
}
上面的这个程序中,有两个逗号表达式:
分别是a * b和a + b中间的一个,另一个是a + b和a * 2中间的一个。
这个程序会输出什么呢?答案是:a * 2,也就是200
分析:
逗号表达式的作用是将多个表达式连接在一起然后返回最后一个表达式的值,因此可以把他对表达式的作用看成这样:
逗号表达式是从左向右依次运算的,因此先处理前面两个表达式:
a * b;
a + b;
返回的是a + b,然后继续和后面的逗号表达式运算:
300; //因为逗号表达式的优先级很低,所以上一个返回的表达式的值已经被算出来了
a * 2;
返回a * 2 的值,为200。