问下sum=a+5*a++;(a=5,sum=0);结果sum是多少

朽木可雕 2009-06-08 07:59:26
是不是应该根据c语言的运算级先算a++在算5*a++ 然后在a+5*a++?
但是计算机给出的结果是30
...全文
250 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
朽木可雕 2009-07-08
  • 打赏
  • 举报
回复
关于 自加自减(后缀)是在完整句结束之后才进行的..所以sum=a+5*a++;前面那个a虽然是后算得但是他没有跳出完整句就不能自加
gxzh0817 2009-06-14
  • 打赏
  • 举报
回复
对对…… 是这个样子……
我想LZ的意思是不明白 a++ 和 ++a 区别吧 ……~!
O(∩_∩)O~
还是好好看书吧!!!!!
snowmumu 2009-06-14
  • 打赏
  • 举报
回复
根据c语言的运算级先算a++在算5*a++ 然后在a+5*a++,给出的结果是30.这个没错.
执行a++的时候,a的值还是5,等到下一次用a的时候它的值才是6,
要是把题目换成sum=a+5*(++a);(a=5,sum=0),结果就是35了。
asideu 2009-06-13
  • 打赏
  • 举报
回复
单就运算顺序讨论 可能很简单
但是许多人都没有注意a的初值是多少?好像二楼的问了 但是楼主说“题目中有……” 说实话恕我眼拙 我没有看见a的初值。
如果a没有初值的话 系统让a是多少 a就可以是多少 那么讨论与之相关的sum有意义?
a88833324 2009-06-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pang68599 的回复:]
如果是按照我认为的先算5*a++此时值为25在加a(因为是a++所以现在应该是6)结果应该是31的。。。
[/Quote]
我也是这么认为的
nicky_zs 2009-06-10
  • 打赏
  • 举报
回复
天啊。。 中国的教育怎么尽干些这种事情啊。。。
wlwshang 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 koulongfei 的回复:]
++运算符是a++所在语句执行完以后再给a自增1的,所以
int a=5,sum=0;
执行sum=a+5*a++;这个过程中根据运算符优先级以及右++的规律有:先a++,此时(a++)=5,a亦=5,则有 sum=5+5*5=30.
此语句执行完,变量a的值才自增1,此时a=6.你可以在cout < <sum;后再加一条语句cout < <a;验证下.
[/Quote]

正解!
sixbusy 2009-06-10
  • 打赏
  • 举报
回复
a++是取值之后++;
例如:
函数 void f(a++);
是传完参数,在f没有执行的时候a=a+1 的!
yungtain 2009-06-10
  • 打赏
  • 举报
回复
int main()
{
int a=5,sum=0;
int b;
sum=a+5*a++;
b=a;
return 0;
}

汇编代码(vs2005):
......
int a=5,sum=0;
0041137E mov dword ptr [a],5 //a=5
00411385 mov dword ptr [sum],0 //sum=0
int b;
sum=a+5*a++;
0041138C mov eax,dword ptr [a] //a值送到eax eax=5
0041138F imul eax,eax,5 //a*5后值送eax eax=25
00411392 add eax,dword ptr [a] //a+a*5值送eax eax=30
00411395 mov dword ptr [sum],eax //eax值传给sum,sum=30
00411398 mov ecx,dword ptr [a] //a值送到ecx ecx=5
0041139B add ecx,1 //ecx+1->ecx ecx=6
0041139E mov dword ptr [a],ecx //ecx-> a地址 a=6
b=a;
004113A1 mov eax,dword ptr [a] // a->eax eax=6
004113A4 mov dword ptr [b],eax //eax->b地址 b=6
return 0;
004113A7 xor eax,eax
}


新手试贴
kernelshell 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 hqin6 的回复:]
引用 21 楼 gx168853 的回复:
应该说明的是:在一个语句中实行a++之后的下一个语句,a才等于6,而不是在本语句的第二步骤就等于6!!明白吗?我的语文功底不是很好哦!呵呵,你要是这样写:sum=5*a++;
sum=sum+a; 的话,那就不一样了!!!这样的话,sum=sum+a;中的a就等于6了!!这是俺的见解,大家互相切磋哦!!


难道一直以来我都理解错了??
[/Quote]
难道这个古老的问题又出现了!无语!但有一点肯定:结果是30,这整条语句结束后,a为6。至于a是什么时候自增的,还需要研究。汇编语言对这个指令是怎么进行的呢?熟悉汇编的介绍一下过程,写个语句。我来学习。哈。
kojie_chen 2009-06-10
  • 打赏
  • 举报
回复
..
飞天御剑流 2009-06-09
  • 打赏
  • 举报
回复
你们全都在白费劲,c/c++标准规定加法乘法的求职顺序是实现相关的,c/c++标准只保证到顺序点的时候所有副作用都被应用,但副作用何时应用是留给

编译器自行决定的,原因是不同的系统效率不同。

对于sum=a+5*a++;而言,分号有一个顺序点,c/c++标准保证当这个语句,同时也是一个完整表达式计算完的时候,a应已经自加一次。

但是,a何时自加,是在算5*a++的时候自加呢,还是算完+运算符的左操作数a之后再自加,甚或算完a+5*a之后再自加,都是可能的,不同编译器出于

自身系统效率最大化的需要,可能采取不同的策略,因此不同编译器可能会出现不同的值。

要避免写这样的代码!!
zjx2388 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 koulongfei 的回复:]
++运算符是a++所在语句执行完以后再给a自增1的,所以
int a=5,sum=0;
执行sum=a+5*a++;这个过程中根据运算符优先级以及右++的规律有:先a++,此时(a++)=5,a亦=5,则有 sum=5+5*5=30.
此语句执行完,变量a的值才自增1,此时a=6.你可以在cout < <sum;后再加一条语句cout < <a;验证下.
[/Quote]

说的很清楚,楼主可以测试下
我理论分析出来的结果也是sum=30,a=6
太乙 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 gx168853 的回复:]
应该说明的是:在一个语句中实行a++之后的下一个语句,a才等于6,而不是在本语句的第二步骤就等于6!!明白吗?我的语文功底不是很好哦!呵呵,你要是这样写:sum=5*a++;
sum=sum+a; 的话,那就不一样了!!!这样的话,sum=sum+a;中的a就等于6了!!这是俺的见解,大家互相切磋哦!!
[/Quote]
难道一直以来我都理解错了??
gx168853 2009-06-09
  • 打赏
  • 举报
回复
应该说明的是:在一个语句中实行a++之后的下一个语句,a才等于6,而不是在本语句的第二步骤就等于6!!明白吗?我的语文功底不是很好哦!呵呵,你要是这样写:sum=5*a++;
sum=sum+a; 的话,那就不一样了!!!这样的话,sum=sum+a;中的a就等于6了!!这是俺的见解,大家互相切磋哦!!
bobo45123 2009-06-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 nlylidb 的回复:]
所谓语句执行是指一个分号的表达式执行后
[/Quote]

同意6楼的观点
koulongfei 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 pang68599 的回复:]
那自加其实是在下一句才能实现自加么?
[/Quote]

不能这么说,变量自加或不自加不是依赖于下一句的,不是说没有下一句就不会给变量自加.
只是在执行语句sum=a+5*a++;时,变量a的值存储在临时空间,在本语句执行完,变量a退出临时存储空间后才能给自增的.
lingyin55 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 pang68599 的回复:]
那我要写成
sum=5*a++;
sum=sum+a;
那结果好不一样了呢
那表达的不和上面的一样么...
[/Quote]

[Quote=引用 7 楼 pang68599 的回复:]
a++是在下次运算的时候加1的为什么前面那个a明明就是后运算的了为什么还不是6?
[/Quote]

1、不能分开写,
2、你说的前面那个a是自加后的a不同。

对于编译器来说,写成sum=a+5*a++;表明第一个a的值在一开始就是已知的。
朽木可雕 2009-06-08
  • 打赏
  • 举报
回复
那自加其实是在下一句才能实现自加么?
pengzhixi 2009-06-08
  • 打赏
  • 举报
回复
这个依赖编译器,不推荐。
加载更多回复(14)

70,035

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧