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

72qzrwbm  于 2023-08-09  发布在  其他
关注(0)|答案(3)|浏览(105)

我的想法很简单。我希望从vector temp中逐个元素地复制到vector data中。

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;
}

字符串
输出:temp={1,2,3,4}但data={1,1,2,3},即使i的cout值为1,2,3,4
不知道为什么。提前感谢帮助!

wribegjk

wribegjk1#

这条线

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());
}

wnavrhmk

wnavrhmk2#

人们可能会想,为什么像这样的情况下的行为没有被定义为等价于在所讨论的语句之后的单独语句中进行递增。我想原因是处理器有一些能力为你做后增量(参见lodsw指令家族)。使用这些指令时,后增量必须在获取数据时发生。因此,为了保证在所有其他使用递增变量之后执行post递增,需要最后执行该获取,或者至少在该语句中所有其他使用rsi之后执行。设计师们可能认为这太过限制。

2exbekwf

2exbekwf3#

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

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

字符串
在这种情况下,首先,我们将从temp[I]中获取值(例如:y),则“i”将递增1(i++),并且在此之后,来自temp[i]的值(在我们的情况下为y)将被存储在data[i]中,其中“i”已经递增1。

相关问题