为什么这段代码无法正确反转数组

时间:2019-11-07 21:04:39

标签: c++

我已经编写了此C ++代码来反转数组。但是它给出了错误的输出。为什么??

#include <bits/stdc++.h>

using namespace std;

int main(){
    int n,i,a,arr[n];
    cin>>n;
    for(i = 0; i<n; i++){
        cin>>arr[i];
    }
    for(i = n-1;i>-1;i--){
        cout<<arr[i]<<" ";
    }
}

3 个答案:

答案 0 :(得分:4)

您的代码具有未定义的行为。不要指望任何特定行为。

问题是vue create ...的定义。

它有两个问题。

  1. 可变长度数组(VLA)不是标准的C ++。一些编译器支持它们作为扩展。
  2. 在该行中,arr在使用前未初始化为值。通过为n中的n分配一个值,数组的大小不会自动更改。

cin >> n使用std::vector<int>,您的代码应具有可预测的行为。

arr

PS

请勿使用int main(){ int n,i,a; cin>>n; std::vector<int> arr(n); for(i = 0; i<n; i++){ cin>>arr[i]; } for(i = n-1;i>-1;i--){ cout<<arr[i]<<" "; } } 。有关详细信息,请参见Why should I not #include <bits/stdc++.h>?

答案 1 :(得分:-1)

它不起作用,因为在您写int n, arr[n]时,n尚未分配值。 将cin>>n放在int arr[n]之前,它将可以正常工作。

答案 2 :(得分:-3)

编辑:https://stackoverflow.com/a/58756962/12335228更快。 Edit2:正如评论所暗示的那样,我对n初始化为零的假设确实是错误的。

哦?您说的输出错误?它对我有用,即使它不应该。 虽然逻辑是正确的,但是您完全可以进入未定义的行为领域:

您要声明n,然后声明arr [n]而不给n分配实际值。这意味着在int为0的情况下,n具有其默认值。因此,数组的容量为0。

无论如何,C ++还是让您编写代码,因为您作为程序员对内存负责。在这种情况下,只需将[]运算符视为(* arr + i)的语法糖,即您的数组+ i的地址