#include <stdio.h> main() {int i=5,j=5,p,q; p=(i++)+(i++)+(i++); q=(++j)+(++j)+(++j); printf("%d,%d,

,%d,%d",p,q,i,j);}问下啊,这个程序的q的值为什么是22呢?谢谢... ,%d,%d",p,q,i,j);
}
问下啊,这个程序的q的值为什么是22呢?谢谢
展开
 我来答
百度网友5e2c30c6c
2012-05-11 · TA获得超过816个赞
知道小有建树答主
回答量:289
采纳率:0%
帮助的人:473万
展开全部
这个问题展开来说会很复杂,我说个大概,你还得去研究一下C标准和相关的文章。
关键词是C的求值顺序。
表达式求值顺序不同于运算结合性和优先级,q=(++j)+(++j)+(++j);这个式子没有顺序点,而++j和q=xxx这些操作都是有副作用(side-effect)的,而副作用的顺序不被保证(这是为了方便各编译器能自行优化代码)。所以最多只能保证执行完以后j=8,而q的值可能由于各编译器优化不同而产生不同结果,我使用gcc4.4.3得到22,你可以试试VC,turbo C,或许有别的结果。
使用gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3,把代码编译成汇编可以看得更明白:

movl $5, 40(%esp) # 40(%esp)是j在栈中的地址,j=5
addl $1, 40(%esp) # j=j+1=6
addl $1, 40(%esp) # j=j+1=7
movl 40(%esp), %eax # eax是累加用寄存器,把j放入寄存器
addl %eax, %eax # eax = eax + eax = 7 + 7 = 14 !!注意这里因为优化,对j进行了两次自增后才执行相加操作,因此结果不是我们想象中的6+7,而是7+7
addl $1, 40(%esp) # j=j+1=8
addl 40(%esp), %eax # eax = eax + j = 22。得到了22而不是21

建议你继续阅读下文,对求值顺序有更加细致精确的描述
http://blog.csdn.net/ox_thedarkness/article/details/613122
jisuan861003
2012-05-11 · TA获得超过589个赞
知道答主
回答量:39
采纳率:0%
帮助的人:23.2万
展开全部
我算出来是p和q的值分别15和24。i和j的值都是8。而且我感觉这也是正确的答案。
p=(i++)+(i++)+(i++)的执行顺序是先执行括号内的,先执行5+5+5,然后i执行三次加一。最后i的值是8.

q=(++j)+(++j)+(++j)是先执行三次j加一,j的值变成8。在执行括号外的相加8+8+8=24。

我是在vs2003中执行了的。
追问
谢谢!如按优先级和结合性的做题顺序应该是p=5+6+7=18,q=6+7+8=21的,可运行出的结果是p=15,q=22,刚查了些资料,据说是vc6.0本身的算法问题,p中的三个表达式统一先取i值给表达式,最后i的值再顺序加1,即p=5+5+5=15,i=5+1+1+1=8,q的值是先同时取前两个j+1的值,再加第三项,最后j的值再顺序加1,即q=(5+1+1)+(5+1+1)+(5+1+1+1)=22,j=5+1+1+1=8,纠结了吧?无语了吧?呵呵,就此执行吧,不要问为什么,哈哈
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
wudiqz
2012-05-11 · 超过10用户采纳过TA的回答
知道答主
回答量:35
采纳率:0%
帮助的人:26.6万
展开全部
#include <stdio.h> main()
{int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d",p,q,i,j);

p=5+6+7=18;
q=6+7+8=21;
一个是加完1后赋值,一个是赋值后加1,不过不知道为什么是22.
追问
谢谢,按正常的优先级做法应该是这样的啊,可运行出的结果是p=15,q=22,刚查了些资料,所说是vc6.0本身的算法问题,p中的三个表达式统一先取i值给表达式,最后i的值再顺序+1,q的值是先取前两个j+1的值,再加第三项,晕~~~呵呵
追答
恩,长见识了
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式