一些特点

1、逗号表达式是C语言优先级最低的运算符。

2、逗号表达式是左结合性(即按从左到右顺序运算)的运算符。


常见表达式

//例一
#include<stdio.h>
void main(){
	int x, y, z;
	o = x = 3, y = 4, z = 5;
	printf("x=%d,y=%d,z=%d,o=%d\n",x,y,z,o);
}

运行结果:x=3,y=4,z=5,o=3

//例二
#include<stdio.h>
void main(){
	int x, y, z, o;
	o = ( x = 3, y = 4, z = 5 );
	printf("x=%d,y=%d,z=%d,o=%d\n",x,y,z,o);
}

运行结果:x=3,y=4,z=5,o=5

我们可以发现例一和例二中,变量o最终的结果是完全不同的。

我们可以先把上面两个表达式简化成👇

例一:o = 表达式1,表达式2,表达式3;

因为逗号表达式是优先级最低的表达式,赋值表达式的优先级高,所以会表达式1的值直接赋值给o

例二:o = (表达式1,表达式2,表达式3);

括号里中的先执行,逗号表达式是左结合性,所以会从左往右依次执行,最后再把表达式3的值赋值给o

小结论:

结合以上两个例子的运行结果我们可以得出一个结论:

当没有括号时,第一个表达式为整个表达式的值。

而有括号时,依次执行后最后一个表达式为整个表达式的值。

而且所有的表达式都依次执行了


例题一

逗号表达式a=2*6,a*3,a+5的值为_____ 

逗号表达式的结果是整个表达式执行完后最后的一个值。

所以我们可以假定逗号表达式的结果为o

把这个式子看成o=(a=2*6,a*3,a+5)

 a=2*6=12,此时表达式的值为12

a*3并不是一个赋值语句,此时表达式的值还是12

运算到这一步,可以看成o=(a+5)=12+5=17

该表达式的值为17

例题二

int a,表达式 (a=4*5,a+6),a++的值为_____

逗号表达式的结果是整个表达式执行完后最后的一个值。

所以我们可以假定逗号表达式的结果为o、

把这个式子看成o=((a=4*5,a+6),a++)

a=4*5=20,此时表达式的值为20

a+6并不是一个赋值语句,此时表达式的值还是20

a++是先赋值这条语句运算完后才会+1,直到这里,表达式的值为20


例题三

int a,表达式为(a=4*5,a+6),a++ 执行完后a的值为_____

这个例题是求a的值,而不是表达式的值,这里表达式2(也就是a++)中的a=a+1也是会执行的,所以a的值为21


例题四

int x=5,y=8,z;

z=(x++,++y,x+y);

求z=_______

 既然有括号,那就先依次执行前面的表达式,再把最后一个表达式赋值给z,

先执行x++,x=x+1=5+1=6

再执行y++,y=y+1=8+1=9

最后z=x+y=6+9=15


PS:如果这里的表达式三为x+++y,则要注意了!

 z=(x++,++y,x+++y);

首先依次执行x++得x=6、++y得y=9

后置++的优先级大于前置++

所以这里是(x++)+y;而不是x+(++y);

(x++)+y这里先把x的值与y的值相加,随后x再自增加1

也就是z=x+y;x=x+1;

这里z的值还是15,但是x的值又加了1,x=7


总结

以上就是今天要讲的内容 ,如果有错误或者疑问,欢迎在评论区中留言。讲得不好,还请多多包涵。


Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐