❝今天在stackoverflow问答平台上看到的一个问题,一段简单的代码,得到的却是预料中不一样的结果。❞
下列代码会输出什么?
int i = 0;
std::cout << i++ << ++i;
Qt君使用MSVC编译器输出的是12
,而在使用Mingw编译器输出的是02
。
「为什么会出现这种情况呢」?
我们不妨看下std::cout
的最外层函数调用:
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