很简单却不明白的问题

Au_Sun 2009-01-17 09:09:24

一个同学问我

int a=3;
int b=(++a)+(++a)+(++a);

b=? 我说15 结果他说是16 ;的确编译出来是16 但是why??
...全文
245 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxgamexx 2009-01-19
  • 打赏
  • 举报
回复
月经贴!!
e_sharp 2009-01-19
  • 打赏
  • 举报
回复
o
paradn 2009-01-19
  • 打赏
  • 举报
回复
像这样的式子的运算顺序在标准里并没有很清晰明确的定义,说的非常笼统,
结果就像咱们大家读《论语》,理解出来的意思五花八门,写编译器的人
也是读着标准写,最终结果就是看他们怎么理解的标准了......
sanguomi 2009-01-18
  • 打赏
  • 举报
回复
这个题目很无聊, 编译器不同 结果也不同
kakaying 2009-01-18
  • 打赏
  • 举报
回复
想想:
(++a)+(++a)+(++a) == ((++a)+(++a))+(++a) == (++a)+((++a)+(++a));
编译器可能采用以上三种优先级中的任何一种,我记得同优先级的是从后往前扫描?
先计算((++a)+(++a))就是5+5,然后计算(++a)==6,就是结果咯
这样的问题可以深究出来弄明白原因,不过确实没什么意义,记住不要在项目代码中使用这样的语句就好了
ppp_10001 2009-01-18
  • 打赏
  • 举报
回复
i++是i先参加运算,再自加1
++i是i先自加1,再参加运算
雷少爷爷 2009-01-18
  • 打赏
  • 举报
回复
学习
一元硬币 2009-01-18
  • 打赏
  • 举报
回复
的确跟编译器有关,但是你的16出现的比较诡异
lbjfeng 2009-01-18
  • 打赏
  • 举报
回复
各位大哥,那能不能说说编译器的工作原理。
我用的vc6.0.小弟也不是很明白为什么是16
shyli 2009-01-18
  • 打赏
  • 举报
回复
又来这个问题,C++标准说这是未定义行为。
见ISO_IEC 9899_TC3
6.5 Expressions
Between the previous and next sequence point an object shall have its stored value
modified at most once by the evaluation of an expression. Furthermore, the prior value
shall be read only to determine the value to be stored.

Annex J
(informative)
Portability issues
J.2 Undefined behavior

Between two sequence points, an object is modified more than once, or is modified
and the prior value is read other than to determine the value to be stored (6.5).
delphi_911 2009-01-18
  • 打赏
  • 举报
回复
(++a)+(++a)+(++a) == ((++a)+(++a))+(++a) == (++a)+((++a)+(++a))

这个有什么用?
gsrdell 2009-01-18
  • 打赏
  • 举报
回复
++a是先加再用,按说应该是18,得出16的值?你用的什么编译器
ysysbaobei 2009-01-18
  • 打赏
  • 举报
回复
mark,顶
AlwaysSLH 2009-01-18
  • 打赏
  • 举报
回复
早点结吧
red_berries 2009-01-18
  • 打赏
  • 举报
回复
无聊
梵净游云 2009-01-18
  • 打赏
  • 举报
回复
你用什么编译器?VC6.0、VC2005和GCC下编译都是18。这是因为编译器在处理表达式(++a)+(++a)+(++a)时是先将a连续自加3次,然后把++i统一当6处理。
melody1128 2009-01-17
  • 打赏
  • 举报
回复
米有实际意义
你还是别研究了吧
星羽 2009-01-17
  • 打赏
  • 举报
回复
和编译器相关的,争论没意义
agaric 2009-01-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wode_dream 的回复:]
引用 2 楼 HelloDan 的回复:
问题很简单,只要你不编写这样的程序就没有这样的问题了。这个问题取决于编译器的

取决于编译器的压栈顺序。记得有人好像是这么说的。支持2楼
[/Quote]

压栈顺序不是问题,问题是编译器还会有其他的优化动作,这种代码你没有办法控制。
deerwin1986 2009-01-17
  • 打赏
  • 举报
回复
编译器相关 不要考虑这种问题 无意义
加载更多回复(9)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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