在找到数组中的最大数字时,数组的正确声明应该是什么?

What should be the proper declaration of array while finding the largest number in array?

C++ 这是我在 C++ 中用于查找数组中最大数字的代码。当我在 IDE 中 运行 时,没有编译错误,但它没有给我输出。我认为问题出在第 8 行的数组声明中。我将第 8 行的数组声明替换为第 11 行,然后它在我的 IDE 中工作正常。所以我不明白为什么数组声明在第 8 行不起作用?

#include <bits/stdc++.h>
using namespace std;
int largest_in_array(int a[], int n);

int main() // main function
{
    int n; // User will enter the size of array 
    int arr[n]; // Line 8
    cout << "Enter the size of array: " << endl;
    cin >> n;
              // Line 11
    cout << "\nEnter the elements of array: " << endl;

    for (int i = 0; i < n; i++) // This loop will run for each element of array that user wants to enter
    {
        cout << "Enter the " << (i + 1) << " element:";
        cin >> arr[i];
        cout << endl;
    }
    cout << "Elements are: [";
    for (int i = 0; i < n; i++) // Prints the elements of array
    {
        // cout << "Enter the " << (i + 1) << " element:";
        cout << arr[i] << " ";
        // cout << endl;
    }
    cout << "]";

    int res = largest_in_array(arr, n); //Function call
    cout << "\nLargest element in array is: " << arr[res] << endl;
    return 0;
}

int largest_in_array(int a[], int n) // function that will return the index of largest element in array
{
    int max = 0;
    for (int i = 1; i < n; i++)
    {
        if (a[max] < a[i])
        {
            max = i;
        }
    }
    return max;
} 

当您在第 8 行有 int n 时,它会在您使用它创建数组时进行初始化。当 n 被显式初始化时,它的值是未定义的行为。您可能正在创建一个数组 比您在第 10 行输入的 n 更大,导致该数组具有额外的随机垃圾,它可能更小意味着您的程序确实读取内存不应该等等

  • 您在用户向 n 输入值之前声明了 int arr[n];n 在您读取并创建 arr 时具有不确定的值。
  • 您不检查用户是否在 n 中输入了正值。零和负大小的数组无效。

其他要点:

  • bits/stdc++.h 不是标准的 header,这使您的程序不可移植。使用正确的 header 文件,例如 iostream
  • arr[n] 是一个 可变长度数组 (VLA),它不是标准 C++ 的一部分。改成 std::vector<int> arr(n);
  • std::endl 的使用是不必要的。这里不需要刷新输出流。请改用 \n

示例:

#include <iostream>
#include <limits>
#include <vector>

int largest_in_array(const std::vector<int>& a) {
    int max = 0;
    for(int i = 1; i < a.size(); i++) {
        if(a[max] < a[i]) {
            max = i;
        }
    }
    return max;
}

int main() // main function
{
    int n; // User will enter the size of array
    std::cout << "Enter the size of array:\n";

    // check that input succeeds and that the value is valid
    if(!(std::cin >> n) || n < 1) return 1;

    std::vector<int> arr(n);
    std::cout << "\nEnter the elements of array:\n";

    for(int i = 0; i < n; i++)
    {
        std::cout << "Enter the " << (i + 1) << " element:";
        if(!(std::cin >> arr[i])) {
            std::cout << "invalid input, bye bye\n";
            return 1;
        }
    }
    std::cout << "Elements are: [";
    for(int i = 0; i < n; i++)
    {
        std::cout << arr[i] << " ";
    }
    std::cout << "]";

    int res = largest_in_array(arr); // Function call
    std::cout << "\nLargest element in array is: " << arr[res] << '\n';
}

也就是说,您可以使用标准算法 std::max_element 而不是自己编写。它 returns 一个 迭代器 到最大元素。 当您不需要知道数组中的索引时,您也可以使用 range-based for 循环,就像在第二个循环中一样。

示例:

#include <algorithm>
#include <cstddef>
#include <iostream>
#include <iterator>
#include <limits>
#include <vector>

int main() {
    int n; // User will enter the size of array
    std::cout << "Enter the size of array:\n";
    if(!(std::cin >> n) || n < 1) return 1;

    std::vector<int> arr(n);
    std::cout << "\nEnter the elements of array:\n";

    for(int i = 0; i < n; i++) // This loop will run for each element of
                               // array that user wants to enter
    {
        std::cout << "Enter the " << (i + 1) << " element:";
        if(!(std::cin >> arr[i])) {
            std::cout << "invalid input, bye bye\n";
            return 1;
        }
    }
    std::cout << "Elements are: [";
    for(auto value : arr) {          // a range-based for loop
        std::cout << value << ' ';
    }
    std::cout << "]\n";

    auto res = std::max_element(arr.begin(), arr.end());
    std::cout << "Largest element in array is: " << *res << '\n';

    std::size_t index = std::distance(arr.begin(), res);
    std::cout << "which has index " << index << '\n';
}