C++:未排序的修改和对"i"的访问

  • 本文关键字:访问 修改 排序 C++ c++
  • 更新时间 :
  • 英文 :


我的想法很简单。我想把一个元素一个元素地从矢量温度复制到矢量数据。

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}即使i的cout值是1,2,3,4

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

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

具有未指定的行为。根据是首先评估data[i]还是首先评估temp[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());
}

人们可能会想,为什么在这样的情况下,行为没有被定义为等价于在问题语句后面的单独语句中递增。我想原因是处理器有一些能力为您进行后增量(请参阅lodsw系列指令)。使用这些指令时,后增量必须在获取数据时发生。因此,为了保证递增后的变量在所有其他使用之后进行,需要最后进行提取,或者至少在该语句中所有其他使用rsi之后进行提取。设计师们可能认为这太过约束了。

为什么人们会说未定义的行为?

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

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

最新更新