c++ - 评估序列和 << 运算符

标签 c++ iostream

<分区>

为什么是这个片段:

int i = 0;
cout << ++i << " " << ++i;

产生2 2而不是 1 2

编辑:关于未定义评估顺序的答案的指针并没有为我解决这个问题。如果cout << ++i << " " << ++i翻译成f (++i, " ", ++i)似乎只有 2 个相关案例:

  1. 第一个参数先于第三个参数求值:f (0, " ", 1)
  2. 第三个参数先于第一个参数求值:f (1, " ", 0)

2 2 在哪里从哪里来?

编辑:好的,我明白了:“在前一个序列点和下一个序列点之间,对象的存储值最多应通过表达式的求值修改一次”。

最佳答案

因为这是 Undefined Behaviour
它也不能输出 0(严格来说 UB 结果可以是任何东西,包括 0 作为输出,但这真的不太可能)因为你使用预增量,这将导致 i 在传递给 operator<<

似乎只有2个相关案例:

1st parameter is evaluated before 3rd one: f (0, " ", 1)
3rd parameter is evaluated before 1st one: f (1, " ", 0)

首先,在UB的情况下没有相关的情况,你可以得到0,1,2,5,0xABCD,AV等等。
其次,您使用pre 增量,因此值将在 传递给函数之前递增。
第三个 f(++i, "",++i);除了已经提到的 UB 之外,将在调用之前评估两个 preincrements,将 i 值增加到 2。

关于c++ - 评估序列和 << 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16003721/

相关文章:

c++ - 一键构建所有配置和平台

c++ - fstream、ofstream、ostream、iostream 之间的区别

c++ - g++4.4 : iostream move semantics

C++ 流日志 Objective-C 对象

c++ - 测试 stream.good() 或 !stream.eof() 读取最后一行两次

c++ - double : Multiplication of big numbers

c++ - 复制构造函数为动态分配做了什么

c++ - 重载运算符 <<

c++ - 编译器错误 : "Non-aggregates cannot be initialized with initializer list."

c++ - Qt 没有匹配函数供调用