编译行为的一个问题?

RaymondCai007 2003-07-29 01:46:21
在VC的编译器中:(GCC好像也是这样)
int i=3;
int p=(++i)+(++i)+(++i);

int i=3;
int p=(++i)+((++i)+(++i));

i = 3;
int r = (++i)*2+ (++i) + (++i);
结果分别是 p=16 q=18 r=21
为什么?
...全文
57 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
RaymondCai007 2003-07-29
  • 打赏
  • 举报
回复
刚才看到vC的汇编码,验证我对++i的判断。
大家看看汇编代码就知道了。
问题3)中由于是代码有一个优化运算。所以结果是21 = ++i + 2*++i + ++i
如果是3×++i,这个3的位置将会有影响。
汇编码
14: int q = 3*++i+ ++i + ++i;
0040106C mov edx,dword ptr [ebp-4]
0040106F add edx,1
00401072 mov dword ptr [ebp-4],edx
00401075 mov eax,dword ptr [ebp-4]
00401078 imul eax,eax,3
0040107B mov ecx,dword ptr [ebp-4]
0040107E add ecx,1
00401081 mov dword ptr [ebp-4],ecx
00401084 add eax,dword ptr [ebp-4]
00401087 mov edx,dword ptr [ebp-4]
0040108A add edx,1
0040108D mov dword ptr [ebp-4],edx
00401090 add eax,dword ptr [ebp-4]
00401093 mov dword ptr [ebp-0Ch],eax
15:
RaymondCai007 2003-07-29
  • 打赏
  • 举报
回复
对于前两个解释好像可以这样,因为++是自增运算符号。
而 +是一个双目运算符,操作的是操作数,所以前两个((++i)+(++i)))
实际上参与运算的是操作数I,优先级上先考虑++运算,所以实际上成了5+5 =10+(++i)
2)这个可以解释为先对第一个(++i)运算之后,由于后面+(。。。。)是一个括号。
所以这时开始运算后面,得到i=6,然后是6+(6+6)
3)至于这一个,明天看看汇编再说吧。感觉上×2后应该是一个立即数才对。
sandrowjw 2003-07-29
  • 打赏
  • 举报
回复
真的很滑稽,第一个例子好像vc是先计算了最后一个++i(所以最后一个加数是4),然后看到了一个+,此时他开始判断是否有连加,如果有连加,则把剩下的运算子都收集好(所以其他两个加数就是6),然后加起来(就是8了)。
第二个例子可能通过那个括号知道要连加了,所以已开始就把三个运算子都计算出来了(是6)。
第三个就太奇怪了,只能解释为编译器有点急性子。

不过从算符优先级上看这个怪癖是有可能的,因为文法设计中可能会出现不同位置的相同算符的优先级不同,特别是复杂的文法。(优先级不同收集的结果就会不同)
oceancat 2003-07-29
  • 打赏
  • 举报
回复
不知道
关注我看到vc下的汇编代码了
但是不知道为什么会是这样算
jeffchang 2003-07-29
  • 打赏
  • 举报
回复
我也想知道为什么

69,371

社区成员

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

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