You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 22:46:04