C++ 数组插入l值,r值

C++ 数组插入l值,r值,c++,arrays,C++,Arrays,这只是出于好奇,而我正在练习数组插入的乐趣。 问题是在下面的代码中,为什么a[i]=a[i+1]给我一些垃圾值,但将其设置为a[i+1]=a[i]解决了这个问题。从逻辑上讲,它们是一样的,但我只是想知道它是否与l值和r值引用有关 #include<iostream> #include<array> using namespace std; int main() { int pos,value; std::array<int,10

这只是出于好奇,而我正在练习数组插入的乐趣。 问题是在下面的代码中,为什么
a[i]=a[i+1]
给我一些垃圾值,但将其设置为
a[i+1]=a[i]
解决了这个问题。从逻辑上讲,它们是一样的,但我只是想知道它是否与l值和r值引用有关

#include<iostream>
    
#include<array>
using namespace std;
int main()
{
    int pos,value;      
    std::array<int,10> arr{1,2,3,4,5,6,7,8,9};
    for (int i:arr){
        cout<<i<<" ";
    }
    std::cout<<"\n";
    cin>>value>>pos;
    for(int i=arr.size()-1;i>=pos;i--){
        arr[i]=arr[i+1];
    }
    arr[pos]=value;
    for (int i:arr){
        cout<<i<<" ";
    }

}
#包括
#包括
使用名称空间std;
int main()
{
int pos,value;
数组arr{1,2,3,4,5,6,7,8,9};
用于(int i:arr){

coutNo,它与l值和r值引用无关

这里,在第一次迭代中,
arr[i+1]
超出了范围。另外,由于您进行了编辑,
arr[i]
也将超出范围

for(int i=arr.size();i>=pos;i--){
    arr[i]=arr[i+1];
}
< C++ >代码> > siz()/<代码>返回元素的数量。记住,在C++中,索引从“代码> 0”/代码>开始,因此最后一个值的索引总是“代码> ARR.siz())-1 < /C> > /P> “从逻辑上讲,他们也是这样做的”

否-第一个版本使用相同的数字(数组中的最后一个)填充数组的受影响部分。第二个版本向上洗牌数字,为
留出空间

用笔和纸手动循环,您将看到第一个版本将相同的值向下复制,直到
pos

您还可以通过访问
arr
越界来启动这两个循环,这使得两个版本都具有未定义的行为

我怀疑您希望版本向上移动数字:

for(int i=arr.size()-2; i>=pos; --i) { // -2 since i+1 must be less than size()
    arr[i+1]=arr[i];
}

arr[i+1]
超出了
i=arr.size()-1
的范围。您的“修复”可以写入数组的边界之外,您只是看不到终端打印输出中的错误。@sweenish我不明白您的意思,兄弟,现在我已经编辑了代码。现在可以了吗???@MikeCAT现在已经修复了这两个代码片段之间没有区别(除了一个空行)和
a[i+1]=a[i]
在它们中都没有使用。
for(int i=arr.size()-2; i>=pos; --i) { // -2 since i+1 must be less than size()
    arr[i+1]=arr[i];
}