鱼C论坛

 找回密码
 立即注册
查看: 3725|回复: 11

学习鱼C的C语言视频,没理解的两个问题求助!

 关闭 [复制链接]
发表于 2011-8-10 00:30:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 ZPCG 于 2011-8-10 18:59 编辑

问题一:(点击图片可以放大看)
自增自减问题.png

                               
登录/注册后可看大图

附件的图中为什么q=22呢,按我的理解

q=(++j)+(++j)+(++j)=6+7+8=21才对,请高手给予指教,谢谢!

问题二:
逗号运算符问题.png


关于逗号运算符的问题,为什么得出的结果y=6而不是表达式(b+c)=10的值呢?
问题二已解决(感谢各位的热心回复):谭浩强书上这里写的有点不正确,应该写成:y = ((x = a+b),(b+c));这样Y才是求整个逗号表达式的值,而用 y = (x = a+b),(b+c);是将 y = (x = a+b)和 (b+c)各看成一个表达式(因为赋值运算符的优先级高于逗号运算符),整个逗号表达式的值是 (b+c),而我们求的X与Y与整个逗号表达式无关,故X和Y均为6。

问题一在11楼的回复中已解决!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 02:30:06 | 显示全部楼层
你搜下。。我看到也有人遇到过你这问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 07:38:45 | 显示全部楼层
留个位坐等答案:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 08:16:52 | 显示全部楼层
额,这是我从别的地方问出的回答
(1)这个y = (a + b),(b + c);
这种问题是从右往左进行,最终结果是 (a + b)


(2)++的这个问题你就不要纠结了,这个跟编译器有关,VC++6和VS2008等是不同的。。。

VC++6:我不是很肯定,我就不发表意见了
VS20008:从右往左执行,最后再把得到的那个值相加 vs2008里面我干肯定 q 是 24
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 08:52:21 | 显示全部楼层
++j 先加1再进后面的运算,不知对不对?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 08:52:46 | 显示全部楼层
问题二论坛有帖子详细解答,地址是http://bbs.fishc.com/thread-3826-1-1.html
问题一嘛,同3楼{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 09:11:12 | 显示全部楼层
经过本人实验,前边两个(++j)值都为7,但是第3个(++j)值为8,所以是q=7+7+8,至于为什么呢,我也不知道:L:L
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 09:32:39 | 显示全部楼层
啊,对了
y = (a + b),(b + c);这个式子“=”优先级大于“,”的
所以式子相当于{y = (a + b)},(b + c);
所以y = (a + b)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 09:43:05 | 显示全部楼层
哎!又再纠结这个问题!你可以先搜下别人发的相关帖子再来提问的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-8-10 10:15:23 | 显示全部楼层
zfzhuman123 发表于 2011-8-10 09:43
哎!又再纠结这个问题!你可以先搜下别人发的相关帖子再来提问的!

不好意思,我刚来论坛不久,我会去找贴来看的,争取以后不再给大家添麻烦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 12:33:48 | 显示全部楼层
这是C程序的一个坑,对于VC和GCC的编译器来说,编译器的运算过程是先算两次j+=1,然后把两个j加起来作为前缀,最后算一次j+=1,再把这个加起来,也就是
q = [(5+1+1) + (5+1+1)] +(5+1+1+1) =22
这是编译器进行二叉树优化运算的结果;
而对于某些编译器(具体哪个忘了)来说,编译过程是优化为q = (5+1+1+1) + (5+1+1+1)  +(5+1+1+1) =24
按照C语言的约定俗称的规律(因为这样的语句实际上规范中没有定义)来说,编译过程是q = (5+1) + (5 +1 +1)+(5 +1 +1 +1) =21
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-8-10 18:57:54 | 显示全部楼层
平子队长 发表于 2011-8-10 12:33
这是C程序的一个坑,对于VC和GCC的编译器来说,编译器的运算过程是先算两次j+=1,然后把两个j加起来作为前缀 ...

谢谢,回答得真好!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-8 17:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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