鱼C论坛

 找回密码
 立即注册
查看: 3626|回复: 13

逗号运算符 问题

[复制链接]
发表于 2012-3-28 21:46:38 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 xu1012 于 2012-3-29 14:05 编辑

#include "stdio.h"
void main()
{
int a = 2,b = 4,c = 6,x,y;
y = (x=a+b),(b+c);
printf("y=%d,x=%d",x,y);
getchar();
}

y为什么等于6啊?

最佳答案

查看完整内容

假设b=2,c=7,d=5, a1=(++b,c--,d+3); a2=++b,c--,d+3; 对于第一行代码,有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是d+3,为8,所以a1=8。   对于第二行代码,那么也是有三个表达式,这时的三个表达式为a2=++b、c--、d+3,(这是因为赋值运算符比逗号运算符优先级高)所以最终表达式的值虽然也为8,但a2=3。   注意:逗号运算的结合性是从左至右,完毕之后整个表达式的值是最后 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-3-28 21:46:39 | 显示全部楼层
本帖最后由 湮汐 于 2012-3-29 12:09 编辑


假设b=2,c=7,d=5,
a1=(++b,c--,d+3);
a2=++b,c--,d+3;
       对于第一行代码,有三个表达式,用逗号分开,所以最终的值应该是最后一个表达式的值,也就是d+3,为8,所以a1=8。
  对于第二行代码,那么也是有三个表达式,这时的三个表达式为a2=++b、c--、d+3,(这是因为赋值运算符比逗号运算符优先级高)所以最终表达式的值虽然也为8,但a2=3。
  注意:逗号运算的结合性是从左至右,完毕之后整个表达式的值是最后一个表达式的值。 但是括号的优先级最高!所以a1取值为d+3,a2取值为++b!楼主不要忘了括号的作用哦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-28 22:47:18 | 显示全部楼层
要知道赋值运算符的优先级要高于逗号运算符的,所以会先把a+b的值给X,然后给Y,最后计算b+c,然后丢弃b+c算出来的值,所以X,Y都等于6.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-28 23:29:37 | 显示全部楼层
逗号运算符相当于间隔,而且优先级最低。
这个程序y = (x=a+b),(b+c);相当于y=(x=a+b),所以y=6后面的 b+c 没什么作用,但会运算
但如果是y = ((x=a+b),(b+c));那么 y=b+c,当括号里面有逗号运算符时,各条语句都会运算,最终取值为最右边的语句。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-28 23:36:25 | 显示全部楼层
我想,可能是你的编译器是向左取值,不是向右取值的,换个编译器试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-3-29 08:45:29 | 显示全部楼层
湮汐 发表于 2012-3-28 23:29
逗号运算符相当于间隔,而且优先级最低。
这个程序y = (x=a+b),(b+c);相当于y=(x=a+b),所以y=6后面的 b+c  ...

逗号运算的结合性是从左至右,完毕之后整个表达式的值是最后一个表达式的值。那应该啊取b+c的值才是呢,
当我把代码改成y = (x=a+b,b+c)时  y=6,x=10了  难道括号里面不能有赋值运算符么?有的话赋值运算符比逗号运算符优先级高运算的是x=a+b吧   继续改代码void main()
{
        int a = 2,b = 4,c = 6,y;
        y = (a+b,b+c);
        printf("y=%d,x=%d",y);
        getchar();
这样答案才是y=10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-29 11:59:27 | 显示全部楼层
括号里面的取右值,因为右边的值是最终值,不是括号里面的“就近原则”(一般是取左边的值),逗号相当于间隔。我在另一个你的帖子里面发了资料的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-29 13:07:33 | 显示全部楼层
3楼的解释已经很清楚了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-3-29 14:00:02 | 显示全部楼层
湮汐 发表于 2012-3-29 12:04
假设b=2,c=7,d=5,
a1=(++b,c--,d+3);
a2=++b,c--,d+3;

感谢!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-29 18:22:36 | 显示全部楼层

感谢要给奖励啊 赶紧送分给版主!~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-3-30 11:58:44 | 显示全部楼层
莫名其妙 发表于 2012-3-29 18:22
感谢要给奖励啊 赶紧送分给版主!~

我刚来  没多久怎么送诶?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-3-30 13:34:10 | 显示全部楼层
本帖最后由 莫名其妙 于 2012-3-30 13:34 编辑
xu1012 发表于 2012-3-30 11:58
我刚来  没多久怎么送诶?


在他的回答下面有个最佳答案!~ 不要送错人了哦!~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-2 15:51:32 | 显示全部楼层
又受教了~每天一点成长~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-4-5 18:14:36 | 显示全部楼层
在输出中,print函数输出的第一个值是x
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 15:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表