我的想法很简单。我想把一个元素一个元素地从矢量温度复制到矢量数据。
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。