前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >意想不到的输出结果

意想不到的输出结果

作者头像
Qt君
发布2020-03-23 12:00:49
5870
发布2020-03-23 12:00:49
举报
文章被收录于专栏:跟Qt君学编程跟Qt君学编程

❝今天在stackoverflow问答平台上看到的一个问题,一段简单的代码,得到的却是预料中不一样的结果。❞

  下列代码会输出什么?

代码语言:javascript
复制
int i = 0;
std::cout << i++ << ++i;

  Qt君使用MSVC编译器输出的是12,而在使用Mingw编译器输出的是02

「为什么会出现这种情况呢」

  我们不妨看下std::cout的最外层函数调用:

代码语言:javascript
复制
operator<<(operator<<(std::cout, i++), ++i);

  对于最外层operator<<()函数,其参数1为:operator<<(std::cout, i++),参数2为:++i「最主要原因是函数形参之间没有明确的求值顺序约定」。这就会导致不同的编译器得出不一样的结果。

  比如有函数f1(f2(a, b), f3(c, d)),参数1f2(a, b)和参数2f3(c, d)的调用顺序是不确定的,有些编译器会先调用f3(c, d)后再f2(a, b),而有些编译器会先调用f2(a, b)后再f3(c, d)

总结

  由于上述形参不确定行为,我们尽量避免形参之间自增或自减的操作。 ref: https://stackoverflow.com/questions/5214611/unexpected-order-of-evaluation-compiler-bug

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档