评估顺序和<<运算符

Evaluation sequence and << operator

本文关键字:lt 运算符 顺序 评估      更新时间:2023-10-16

为什么这个片段:

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

产生2 2而不是1 2 ?

编辑:指向未定义的求值顺序的答案的指针不会为我清除这个问题。如果将cout << ++i << " " << ++i翻译成f (++i, " ", ++i),似乎只有两种相关情况:

  1. 第一个参数在第三个参数之前求值:f (0, " ", 1)
  2. 第三个参数在第一个参数之前求值:f (1, " ", 0)

2 2从何而来?

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

因为这是未定义行为
它也不能输出0(严格地说,在UB结果的情况下可以是任何东西,包括0作为输出,但这真的不太可能),因为您使用预增量,这将导致i在传递给操作符<<

之前被增加

似乎只有两种相关的情况:

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等等。
其次,您使用前置增量,因此值将在传递给函数之前递增
第三个f(++i, " ", ++i);除了已经提到的UB之外,将在调用之前计算预增量,将i值增加到2。