(++x)+(++x)+(++x)

qixiawoshishui 2009-10-29 10:34:11
x初值为5然而(++x)+(++x)+(++x)值为22为什么???
...全文
178 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
asimay 2009-10-30
  • 打赏
  • 举报
回复
这种题编译应该是不确定行为的warning。
qixiawoshishui 2009-10-30
  • 打赏
  • 举报
回复
一位高手提供给的

各个编译器下自加运算的不同结果
题目:X=5 (++X)+(++X)+(++X)的结果

TC2.0以及VS C# .net2.0
运算结果为 21
这个和我们很容易想到 运算过程是 6+7+8
第一步X先自加 为6
第二步X自加为7 与前一个6相加得 13
第三步X自加为8 与13相加为21

VS2005 C++
运算结果是 24
运算过程是:
第一步 X自加一次 为6
第二步 X再自加一次为7
第三步 X再自己为8
最后三个8相加为24
这里括号中的自加运算符优先级更高 先运算 随后再参加相加运算


VC6下
运算结果为22
运算过程看以下反汇编代码: x用[x]表示]
00401036 mov eax,[x]
00401039 add eax,1
0040103C mov [a],eax;完成第一个++x,此时x=6
0040103F mov ecx,[x]
00401042 add ecx,1
00401045 mov [x],ecx;完成第二个++x,此时x=7
00401048 mov edx,[x]
0040104B add edx,[x];完成(++x)+(++x),此时结果是7+7=14
0040104E mov eax,[x]
00401051 add eax,1
00401054 mov [x],eax;完成第三个++x,此时x=4
00401057 add edx,[x];完成[(++x)+(++x)]+(++x),此时结果是14+8=22
0040105A mov [result],edx

所以你其实可以这样理解:
第一步 (++x)+(++x)这一步要完成2次++a后a=3,然后将结果相加7+7=14,第一步的结果是14
第二步 14+(++x)这一步先完成一次++x后a=8,然后预算14+8,得到最后结果22
所以总结得到++前置的运算优先级…局部…大于+,请注意那个局部
wightmight 2009-10-30
  • 打赏
  • 举报
回复
楼上说的似乎有点道理
booksoon 2009-10-30
  • 打赏
  • 举报
回复
别再折腾这样的问题啦~
特烦中国式的考试,一大串的+++++++,有意义吗?
真在程序中出现这样的写法,说明你的编程习惯差的很~~~
OneBleach 2009-10-30
  • 打赏
  • 举报
回复
依赖编译器实现
苍蝇①号 2009-10-30
  • 打赏
  • 举报
回复
这样的情况只有在中国式的考试中会出现,现实中要是你写出这样的代码的话老板会炒你鱿鱼
mstlq 2009-10-29
  • 打赏
  • 举报
回复
请自行查看反汇编代码……
另外,此问题结果依赖编译器实现,深究无益……
slowgrace 2009-10-29
  • 打赏
  • 举报
回复
++++++++

69,382

社区成员

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

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