c语言逗号表达式的问题

【例 3.19】
main(){
int a=2,b=4,c=6,x,y;
y=(x=a+b),(b+c);
printf("y=%d,x=%d",y,x);
}
本例中,y 等于整个逗号表达式的值,也就是表达式 2 的值,x 是第一个表达式的值。
-----------------------------------------------------------------以上内容是从谭浩强的C语言教程里看的,运行后显示y=6,x=6
为什么说y是表达式2的值,表达式2不就是(b+c)吗?恳请大家给我完整地分析一下这个程序,包括其中的运算优先级。我刚开始学,很多东西都捋不清。
对运行结果y=6,x=6我没异议,但为什么说y是表达式2的值?????????????这样y不就等于10了吗?自相矛盾啊
看来是谭浩强的书的错别字,天地良心,网上下的电子书。
https://gss0.baidu.com/7LsWdDW5_xN3otqbppnN2DJv/andrew%B9%C2%C0%C7/pic/item/c2bcc37e492e4f360dd7da08.jpg
上面的是截图!
大 家 仔 细 看 我 的 问 题 补 充,

看 来 是 我 的 表 达 能 力 太 差

了 哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈 啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊

逗号运算符的优先级是15级,左结合,其作用是用逗号将两个表达式连接起来。
逗号运算符的一般形式是:表达式1,表达式2
逗号运算符的求解过程是:先邱表达式1,再求表达式2,整个表达式的值是表达式2的值。

你上面的列子是正确的,因为逗号运算符的优先级要低于赋值运算符。
y=(x=a+b),(b+c);解释如下
先算x=a+b得x=6,然后把x的值赋给了y,得y=6,接着运算b+c

如果把y=(x=a+b),(b+c);改成y=((x=a+b),(b+c));那么x=6,y=10.

明白了吧?呵呵,我查过书的哦!!

C语言提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来。如:

3+5,6+8

称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为

表达式1,表达式2

逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。例如,上面的逗号表达式“3+5,6+8”的值为14。又如,逗号表达式
a=3*5,a*4
对此表达式的求解,读者可能会有两种不同的理解:一种认为“3*5,a*4” 是一个逗号表达式,先求出此逗号表达式的值, 如果a的原值为3,则逗号表达式的值为12,将12赋给a, 因此最后a的值为12。另一种认为:“a=3*5”是一个赋值表达式”,“a*4”是另一个表达式,二者用逗号相连,构成一个逗号表达式。这两者哪一个对呢?赋值运算符的优先级别高于逗号运算符, 因此应先求解a=3*5(也就是把“a=3*5”作为一个表达式)。经计算和赋值后得到a的值为15,然后求解a*4,得60。整个逗号表达式的值为60。
一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式,如(a=3*5,a*4),a+5 先计算出a的值等于15,再进行a*4的运算得60(但a值未变,仍为15),再进行a+5得20,即整个表达式的值为20。
逗号表达式的一般形式可以扩展为

表达式1,表达式2,表达式3……表达式n

它的值为表达式n的值。

逗号运算符是所有运算符中级别最低的。因此,下面两个表达式的作用是不同的:

① x=(a=3,6*3)
② x=a=3,6*a

第①个是一个赋值表达式,将一个逗号表达式的值赋给x,x的值等于18。第②个是逗号表达式,它包括一个赋值表达式和一个算术表达式,x的值为3。

其实,逗号表达式无非是把若干个表达式“串联”起来。在许多情况下,使用逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到和使用整个逗号表达式的值,逗号表达式最常用于循环语句(for语句)中.

请注意并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。如

printf("%d,%d,%d",a,b,c);

上一行中的“a,b,c”并不是一个逗号表达式,它是printf函数的3个参数,参数间用逗号间隔。
如果改写为

printf("%d,%d,%d",(a,b,c),b,c);

则“(a,b,c)”是一个逗号表达式,它的值等于c的值。括弧内的逗号不是参数间的分隔符而是逗号运算符。括弧中的内容是一个整体,作为printf函数的一个参数。
C语言表达能力强,其中一个重要方面就在于它的表达式类型丰富,运算符功能强,因而c使用灵活,适应性强
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-09-30
逗号运算符的做优先级是最低的,所以要先算赋值运算符.
y=(x=a+b),(b+c)是一个表达式,包括两部分:
表达式1是一个赋值表达式,表达式2是一个算术表达式.
老谭的书里说的是整个逗号表达式的值是表达式2的值,所以,整个逗号表达式的值是b+c,y的值是表达式1的值,即a+b.
他写错了.这样写就对了y=((x=a+b),b+c);本回答被提问者采纳
第2个回答  2007-12-29
是你看的那个电子书表述有误,逗号运算符优先级特别低,当然也比赋值运算符=低,问题中的表达式求值顺序是:
1.x=a+b得到x的值为6,赋值表达式的值也为6
2.y=6得到y的值为6,赋值表达式的值也为6
3.b+c得到表达式的值为10
4. 6,10最后得到逗号表达式的值为10

显然电子书说的y等于整个逗号表达式的值是错的,运行结果也说明了这一点
第3个回答  2007-12-29
▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
看来楼主是没搞懂这个:

a=2,b=3,c,d;
a+b,b+1; 没有赋值的语句,里面的表达式的最后一个的值是语句的值
c=a+b,b+1; c的值是什么是a+b
c=(a+b),b+1; c的值是a+b
c=(a+b,b+1); c的值才是b+1
第4个回答  2007-12-29
楼上说的可能自己也没有理解清楚
给你个例子
y=4,5;这个y会等于4
y=(4,5);这个时候y=5
知道第二个为什么等于5吗?
简单的说,括号优先级高,括号里面先算4,然后算5把5赋值给y,其实这个里面的逗号也没什么运算,也就是分割而已.
......................................
/// 下面回答楼主

y的值应该是等于x的值

第一步 括号的优先级是最高的,所以先运算括号里面,

然后括号里面完了后赋值给y 也就是x赋值给y

然后是逗号后面的b+c当然是空计算 ,没有赋值给任何变量

你可能不知道逗号是干什么的吧,其实逗号是分割作用的,
逗号左边和右边是没关系的.

你看看你上面的定义就知道了 你上面是这样的int a=2,b=4,c=6,x,y;
你想想,如果按照你说的逻辑的话,那么y赋值是(b+c)的话,那你的int a=2,b=4,c=6,x,y这句话的a又等于什么值???
那不就变成了所有的变量的值都等于最后一个y了不是吗,呵呵
所以逗号仅仅分割作用,不参加逗号左边和右边的计算.

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网