c ++:无序修改和访问“i”

时间:2015-11-16 19:38:41

标签: c++

我的想法非常简单。 我希望将元素从矢量temp复制到矢量数据。

void copy(vector<int> &data, vector<int> &temp)
{    
    int i=0;
    while (i<data.size()) {
    data[i]=temp[i++];//unsequenced modification and access to "i"
    cout<<i<<endl;
}

输出: 温度= {1,2,3,4} 但数据= {1,1,2,3} 即使我的cout值是1,2,3,4

想知道为什么。 提前感谢您的帮助!

4 个答案:

答案 0 :(得分:9)

该行

data[i]=temp[i++];//unsequenced modification and access to "i"

有未定义的行为。执行该行的结果将有所不同,具体取决于是先评估data[i]还是先评估temp[i++]

使用

while (i<data.size()) {
    data[i]=temp[i];
    ++i;
}

作为替代方案,请使用std::copy函数。

void copy(vector<int> &data, vector<int> &temp)
{
   std::copy(temp.begin(), temp.end(), data.begin());
}

答案 1 :(得分:-1)

有人可能想知道为什么像这样的情况下的行为不是定义的等同于在相关问题之后的单独语句中递增。我想原因是处理器有能力为你做增量后(参见lodsw系列指令)。使用这些指令时,后增量必须在您获取数据时发生。因此,为了保证增量变量的所有其他使用之后的后增量将要求最后完成该提取,或者至少在该语句中的所有其他rsi使用之后完成。设计师可能认为这太过限制了。

答案 2 :(得分:-2)

您遇到了来自i++的副作用,它使您受优化器的支配,优化器可以根据您何时以编写代码的方式进行增量。为了安全起见,请

data[i] = temp[i];
i++;

答案 3 :(得分:-2)

人们为什么对未定义的行为发表看法?

data[i]=temp[i++];

在这种情况下,首先,我们将从temp [I]中获取值(例如:y),然后将“ i”增加1(i ++),然后从temp [i]中获取值(y (以我们的情况为准)将存储在data [i]中,其中“ i”已经加1。