向量分配的输出不正确?

时间:2015-12-07 10:25:14

标签: c++11 vector order-of-execution

以下代码段是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}}

2 个答案:

答案 0 :(得分:1)

<强> EDITED

我们将讨论未定义的行为,只关注程序如何到达指定的输出。

首先,让我们陈述一个事实:

  • i ++将增加i的值,但返回我在增加之前保持的原始值。

来自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;赋值:

  • LHS,v [i ++]:i增加到1,i ++返回0到v [i ++]。
  • RHS,i ++:我现在有值1,但是增加到2,但是RHS的i ++返回1.
  • 作业:从上面开始,作业结果为:v [0] = 1(之后我的值为2)。

因此,打印v [0]和v [1]将分别评估为1(更新值)和0(初始化)。

答案 1 :(得分:-1)

这是执行顺序的问题,由于c ++ 11:

,它是未定义的
  

5.17分配和复合赋值运算符

     

赋值运算符(=)和复合赋值运算符   所有组从右到左。所有都需要左侧可修改的左值   操作数并返回一个引用左操作数的左值。结果   在所有情况下,如果左操作数是位字段,则是位字段。 在   在所有情况下,分配在之后>的值计算顺序排序   右边和左边的操作数,以及之前的值的计算   作业表达

简单地说,左参数的修改在值计算之后排序,但不是计算的副作用,在返回对象的引用之前和之前的顺序。

所以要采取的行动是

一个。评估左侧(表达式的返回值i ++ = 0)

B中。返回对象的引用(返回对表达式v [i ++]的对象的引用)

℃。计算左侧的副作用,即i-> 1

d。计算右侧的副作用,即i-> 2

从上面的规则可以看出,目前尚不清楚订单是否为ABCD 或者如果它应该是ACBD,因为没有定义副作用计算的顺序,如果它应该首先发生在左侧,或者首先发生在右侧。