写在前面
在写题过程中,对逗号表达式的运算有些困惑,查阅资料后明白了一些,把我理解的整理出来和大家分享。如有不当之处,烦请各位批评指正。🌹
一、逗号运算符
使用逗号运算符是为了把几个表达式放在一起。
示例
1+1,3+5
二、逗号表达式
使用逗号运算符连接起来的多个表达式即为逗号表达式。
从本质上讲,逗号的作用是将一系列运算按顺序执行。
格式:表达式1,表达式2,表达式3
示例:结果为8
(1+1,3+5)
整个逗号表达式的值为系列中最后一个表达式的值。如本例中3+5=8
逗号表达式计算方法:
- 从左到右逐个计算
- 整个表达式作为一个整体,它的值是最后一个表达式的值
- 逗号运算符是所有运算符中级别最低的
示例一
a=2*5,a*4
对此表达式的求解,大家可能会有两种不同的理解:
一种认为“2*5,a*4” 是一个逗号表达式,先求出此逗号表达式的值, 如果a的原值为3,则逗号表达式的值为12,将12赋给a, 因此最后a的值为12。
另一种认为:“a=2*5”是一个赋值表达式”,“a*4”是另一个表达式,二者用逗号相连,构成一个逗号表达式。这两者哪一个对呢?
我们知道,赋值运算符的优先级别高于逗号运算符, 因此应先求解a=2*5(也就是把“a=2*5”作为一个表达式)。经计算和赋值后得到a的值为10,然后求解a*4,得40。整个逗号表达式的值为40。
示例二
#include<stdio.h>
void main()
{
int a;
printf("%d\n",(a=3*5,a*4,a+5));
}
本例结果为: 20
对于逗号表达式,从左往右进行计算,赋值运算a = 15,然后计算a * 4 = 60,再者计算a + 5 = 20,20作为这个逗号表达式的最终结果打印出来
一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式,如(a=3*5,a*4),a+5 先计算出a的值等于15,再进行a*4的运算得60(但a值未变,仍为15),再进行a+5得20,即整个表达式的值为20。
由于逗号运算符级别是最低的,所以下面两个表达式的作用也是不同的:
示例三
① x=(a*2,3*2)
② x=a=2,a*3
①是赋值表达式,将一个逗号表达式的值赋给x,x的值等于6
②是一个赋值表达式和一个算术表达式,x的值为2
注意
并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。如
printf("%d,%c,%d",a,b,c);//这里的“a,b,c”并不是一个逗号表达式,它是printf函数的3个参数,参数间用逗号间隔。
如果改写为
printf("%d,%d,%d",(a,b,c),b,c);
则“(a,b,c)”是一个逗号表达式,它的值等于c的值。括弧内的逗号不是参数间的分隔符而是逗号运算符。括弧中的内容是一个整体,作为printf函数的一个参数。
示例
若x和y都是int型变量,x=100,y=200,且有下面的程序片段:
printf("%d",(x,y)); //(x,y)是一个逗号表达式,其值为y
上面程序片段的输出结果是200