求值顺序点

Corner 2012-04-27 03:10:48

int a = 3;
int b = (++a) + (++a);
cout<<b<<endl<<a<<endl;

对于这一段代码,我之前一直认为结果是b=10,a=5,因为两个++a先自增再参与运算,自增两次后变为5,所以b=5+5。后来看了对于求值顺序点的解释,突然觉得以前的想法是错误的,因为++a和加号操作符都没有求值顺序点,所以++a两次所造成的副作用并没有生效,那么b的实际结果应该是b=3+3=6,a的值比较迷惑,但是实际运行结果b=10,a=5,所以感觉到很迷惑,是我关于求值顺序点的理解错了么?请大家指点一下,多谢。
...全文
191 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamnobody 2012-05-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

哦~就是还是可能会生效的了。。。那我就明白了……不过看过求值顺序点之后我突然搞不懂a++和++a有什么区别了……反正都没有求值顺序点的。
[/Quote]
a++ 这个表达式的值是 a 被修改之前的值.
++a 这个表达式的值是 a 被修改之后的值.

还有,先使用后修改,还是先修改就使用这样的说法是不标准的.


http://topic.csdn.net/u/20110826/09/601ebe9c-c2ae-4d63-a4e2-506c618bb654.html?2816

wszzfzsc 2012-04-27
  • 打赏
  • 举报
回复
同一个局部变量变化将受到影响!
Corner 2012-04-27
  • 打赏
  • 举报
回复
哦~就是还是可能会生效的了。。。那我就明白了……不过看过求值顺序点之后我突然搞不懂a++和++a有什么区别了……反正都没有求值顺序点的。
iamnobody 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

没有求值顺序点的意思不是对环境的改变没有生效么?那int b = (++a) + (++a);两个++a子表达式运算之后a的结果并没有受到影响,所以+号左右不都应该是3么?
[/Quote]

没有顺序点不是说没有生效,是不能保证生效或者没生效,所以...
evencoming 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
没有求值顺序点的意思不是对环境的改变没有生效么?那int b = (++a) + (++a);两个++a子表达式运算之后a的结果并没有受到影响,所以+号左右不都应该是3么?
[/Quote]
你已经混乱了.
Corner 2012-04-27
  • 打赏
  • 举报
回复
没有求值顺序点的意思不是对环境的改变没有生效么?那int b = (++a) + (++a);两个++a子表达式运算之后a的结果并没有受到影响,所以+号左右不都应该是3么?
evencoming 2012-04-27
  • 打赏
  • 举报
回复
如果非要纠结一个解释的话:
首先,++a,a的值为4,再++a,a的值为5.
然后
因为两个++a的返回都 a,于是 相当于 b=a+a,即b=10.
而且,从这个结果可以猜出,你用的vc.
evencoming 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
引用 1 楼 的回复:
你都知道了求职顺序点,那为什么不知道这个是未定义行为?
还在探究这个的结果?

因为我觉得这里未定义的行为是指对a的结果的影响,因为改变了两次,但是我觉得对b的影响应该不属于未定义行为,b应该等于6才对,对于结果是10比较迷惑,这种代码在实际情况中我也会尽力避免。
[/Quote]
a结果不固定,++a表达式返回的值不固定,那么 b的结果怎么可能固定???
Corner 2012-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
你都知道了求职顺序点,那为什么不知道这个是未定义行为?
还在探究这个的结果?
[/Quote]
因为我觉得这里未定义的行为是指对a的结果的影响,因为改变了两次,但是我觉得对b的影响应该不属于未定义行为,b应该等于6才对,对于结果是10比较迷惑,这种代码在实际情况中我也会尽力避免。
evencoming 2012-04-27
  • 打赏
  • 举报
回复
你都知道了求职顺序点,那为什么不知道这个是未定义行为?
还在探究这个的结果?

69,371

社区成员

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

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