以下代码段是From Herb Sutter的博客here
g ++输出10
。 MSVC也输出i
。不同编译器的输出可能不同。
我无法理解变量10
是如何递增的。
任何人都可以解释一下输出是10
,#include <iostream>
#include <vector>
#include <string>
int main()
{
std::vector<int> v = { 0, 0 };
int i = 0;
v[i++] = i++;
std::cout << v[0] << v[1] << std::endl;
}
是否真的正确输出?
{{1}}
答案 0 :(得分:1)
<强> EDITED 强>
我们将讨论未定义的行为,只关注程序如何到达指定的输出。
首先,让我们陈述一个事实:
来自What is the difference between ++i and i++?。
现在,行
@echo off
start /wait program1.exe
start /wait program2.exe
start /wait program3.exe
在您的情况下,按顺序评估&#34; LHS&#34; - &GT; &#34; RHS&#34; - &GT;赋值:
因此,打印v [0]和v [1]将分别评估为1(更新值)和0(初始化)。
答案 1 :(得分:-1)
这是执行顺序的问题,由于c ++ 11:
,它是未定义的5.17分配和复合赋值运算符
赋值运算符(=)和复合赋值运算符 所有组从右到左。所有都需要左侧可修改的左值 操作数并返回一个引用左操作数的左值。结果 在所有情况下,如果左操作数是位字段,则是位字段。 在 在所有情况下,分配在之后>>的值计算顺序排序 右边和左边的操作数,以及之前的值的计算 作业表达。
简单地说,左参数的修改在值计算之后排序,但不是计算的副作用,在返回对象的引用之前和之前的顺序。
所以要采取的行动是
一个。评估左侧(表达式的返回值i ++ = 0)
B中。返回对象的引用(返回对表达式v [i ++]的对象的引用)
℃。计算左侧的副作用,即i-> 1
d。计算右侧的副作用,即i-> 2
从上面的规则可以看出,目前尚不清楚订单是否为ABCD 或者如果它应该是ACBD,因为没有定义副作用计算的顺序,如果它应该首先发生在左侧,或者首先发生在右侧。