【问题标题】:why this code can't reverse an array properly为什么此代码无法正确反转数组
【发布时间】:2019-11-07 21:04:39
【问题描述】:

我已经编写了这个 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]<<" ";
    }
}

【问题讨论】:

  • "输出错误。" 您的输入和预期输出是什么?实际输出是多少?这些都是minimal reproducible example 的重要组成部分。
  • int n,i,a,arr[n]; 中,您用于数组的n 的值是多少?
  • 数组的大小在创建后是固定的。当您创建arr[n] 时,您认为n 等于什么?更不用说可变长度数组(在编译时大小未知)不在标准 C++ 中,您应该改用 std::vector。另见stackoverflow.com/questions/31816095/…

标签: c++


【解决方案1】:

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

问题是arr的定义。

它有两个问题。

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

std::vector&lt;int&gt; 用于arr,您的代码应该具有可预测的行为。

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

附言

不要使用#include &lt;bits/stdc++.h&gt;。详情请见Why should I not #include <bits/stdc++.h>?

【讨论】:

    【解决方案2】:

    它不起作用,因为当您编写int n, arr[n] 时,那时n 还没有被赋值。 将cin&gt;&gt;n 放在int arr[n] 之前,它将正常工作。

    【讨论】:

      【解决方案3】:

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

      哦?你说输出错误?它对我有用,即使它不应该。 虽然逻辑是正确的,但您在这里很容易进入未定义行为领域:

      您正在声明 n,然后声明 arr[n] 而不为 n 分配实际值。这意味着 n 有它的默认值,在 int 0 的情况下。所以你的数组的容量为 0。

      C++ 让你无论如何都要写进去,因为你作为程序员要对你的记忆负责。只需将本例中的 [] 运算符视为 (*arr+i) 的语法糖,即数组的地址 + i

      【讨论】:

      • "这意味着 n 有它的默认值,在 int 0 的情况下" - 这是不正确的。 n 具有不确定的值,而不是 0。
      猜你喜欢
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-22
      • 1970-01-01
      相关资源
      最近更新 更多