不能那样理解。逗号表达式是已经声明过的变量合法组成的多个有效运算表达式用逗号隔开,而int a=1,b=2;只能有一种解释,那就是声明和初始化变量时可以把多个相同类型的变量用逗号隔开写在同一个类型符后面,最后用分号结束。对上面的声明,如果再声明一个int c;,那么,c=(a=1,b=2)运算后c=2,因为(a=1,b=2)取最右边一个逗号后表达式的运算结果。所以,我觉得c=(a=1,b=2)中的(a=1,b=2)是逗号表达式,而int a=1,b=2不是逗号表达式!计算机语言的所谓“语法”其实只是一些书写规定,有很多甚至是不能变通的,比如char *p,*q,语法说*是属于char而不属于后面的变量的,但若写成char *p,q后q却不认为是指针,这又怎么理解呢?那就是为了方便,不然,如
char *p,w,x;这样的声明就要写成两行了:
char *p;
char w,x;
……
C语言提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来。如:
3+5,6+8
称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为
表达式1,表达式2
逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。
也就是说 上面先执行 a=1 也就是给a初始化赋值,然后执行b=2也就是给b初始化赋值
所以,ab都赋值了。
优先级的问题,逗号在运算符中是最低优先级,所以先进行 = 运算,这样写就清除了 (a=1, b=2) 括起来的部分是逗号表达式的值,而a的值为1, b的值为2。同理扩展:
int a, b;
a = (1, b) = 2; 相当于 a = b = 2, 执行完后,a, b的值均为2
而 a = (b, 1) = 2, 相当于 a = 1 = 2, 编译会报错
为什么你会这么理解呢?
其实它相当于
int a=1;
int b=2;
你不要把它想复杂了