C++17前cout语句求值顺序疑问:为何会输出0 0?
为什么C++17前这段代码会输出
0 0? 先看这段代码:
#include <iostream> int main() { int i = 0; std::cout << ++i << ' ' << --i << std::endl; }
你觉得只能输出1 0或0 1,是默认认为<<的操作数要么从左到右求值,要么从右到左,但在C++17标准之前,这是完全错误的假设。
C++17之前,<<运算符的多个操作数之间的求值顺序属于未定义行为——编译器可以自由选择任何顺序计算各个操作数,甚至可以交错执行它们的副作用(比如修改i的操作)和值的读取。
具体到0 0的情况:
- 编译器可能先执行
++i,把i改成1,接着马上执行--i,把i改回0;之后才分别读取i的值,输出两次0。 - 或者反过来,先执行
--i把i改成-1,再执行++i改回0,然后读取两次i的值输出。
因为++i和--i都是返回i的引用,而非临时值。如果编译器选择先完成所有对i的修改操作,再统一读取i的值来输出,那两次输出的就是最终的0。
C17之后标准明确了,对于<<这类运算符,操作数是从左到右依次求值的,所以这段代码在C17及之后会稳定输出1 0,不会再有未定义行为。
内容的提问来源于stack exchange,提问作者Mati
相关产品推荐
相关产品推荐

