C++代码没有错误但没有给出输出

C++ code don't have errors but not giving output

我正在用 C++ 编写选择排序代码。当我在 powershell 中使用命令 g++ main.cpp -o main 编译它时它没有给出错误但是当我 运行 使用 ./main 的代码时它没有显示任何内容。我尝试使用 hello world 程序,它成功了。我不知道为什么选择排序代码不起作用。

这里是选择排序的代码

#include<iostream>

using namespace std;

int main()
{
   int n, a[n];

   cout << "Enter the size of the array = ";
   cin >> n;

   cout << "Enter the numbers :" << endl;

   for (int i = 0; i < n; i++)
   {
       cin >> a[i];
   }

   for (int i = 0; i < n-1; i++)
   {
       for (int j = i+1; j < n; j++)
       {
           if (a[i] > a[j])
           {
               int temp = a[i];
               a[i] = a[j];
               a[j] = temp;
           }
       }
   }

   for (int b=0; b<n; b++)
   {
       cout<<a[b];
   }

   return 0;
}

始终初始化变量。没有初始化的声明是一种代码味道,例如这个:

int n;

问题紧随其后,因为

int n, a[n];

使用 n 未初始化。编译器在警告方面做得很好:https://godbolt.org/z/ErPY3x936。在你初始化 n 之前,它有一个不确定的值。使用它的值会导致未定义的行为。此外,a[n] 是可变长度数组(除非 n 是常量表达式),它不是标准 C++ 的一部分。当您需要一个大小仅在运行时已知的数组时,您可以使用 std::vector:

int n = 0;
cout << "Enter the size of the array = ";
cin >> n;
std::vector<int> arr(n);

您正在尝试使用可变长度数组

int n, a[n];

变长数组不是标准的 C++ 功能。所以你应该避免使用它们。而是使用标准容器 std::vector<int>.

而且变量n没有初始化。所以可变长度数组的声明调用了未定义的行为。

在对数组进行排序的 for 循环中,数组元素的交换过多。

选择排序算法假定数组中的选定元素最多交换一次。

还有标准函数 std::swap 可以用来代替手动交换元素。

您的程序可以如下所示

#include <iostream>
#include <utility>
#include <vector>

int main()
{
    size_t n = 0;

    std::cout << "Enter the size of the array (0 - exit): ";
    std::cin >> n;

    if ( n )
    {
        std::vector<int> v( n );

        std::cout << "Enter the numbers :" << std::endl;

        for ( auto &item : v )
        {
            std::cin >> item;
        }

        for ( std::vector<int>::size_type i = 0; i < v.size(); i++ )
        {
            auto min = i;

            for ( auto j = i + 1; j < v.size(); j++ )
            {
                if (  v[j] < v[min] ) min = j;
            }

            if ( min != i ) std::swap( v[min], v[i] ); 
        }

       for ( const auto &item : v )
       {
           std::cout << item << ' ';
       }
       std::cout << std::endl; 
    }

    return 0;
}.

你的程序有2个问题

错误 1

在标准 C++ 中,数组的大小必须是编译时间常数。举个例子,

int n = 10;
int arr[n] ; //INCORRECT because n is not a constant expression

上面的正确写法是:

const int n = 10;
int arr[n]; //CORRECT

错误 2

您正在使用未初始化的变量,这会导致未定义的行为。特别是当你写道:

int n, a[n]; //here variable n is uninitialized and holds **indeterminate value**.

在上面的语句中,您正在创建一个名为 nint,但是由于您没有明确地初始化它,它拥有一个 不确定的值

接下来,您将该垃圾值用作数组的大小 a。但请注意,使用未初始化的变量会导致 未定义的行为

Undefined behavior means anything1 can happen including but not limited to the program giving your expected output. But never rely(or make conclusions based) on the output of a program that has undefined behavior.

这就是为什么建议

always initialize built in types in local/block scope.

解决方案

更好的方法是使用 std::vector,如下所示。


#include <iostream>
#include <vector>
int main()
{
    int n = 0; //always initialize built in types in local/block scope 
    
    std::cout<<"Enter size: "<<std::endl;
    std::cin >> n;
    
    //create a vector of size n  
    std::vector<int> a(n);
    
    //iterate and ask for input 
    for(int i = 0; i < a.size(); ++i)
    {
        std::cout<<"Enter element: "<<std::endl;
        std::cin >> a[i];
    }
    
    for (int i = 0; i < a.size() - 1; ++i) 
    {
        
        int index = i;
        for (int j = i + 1; j < a.size(); j++) {
          
          if (a[j] < a[index])
            index = j;
        }
        
        int temp = a[index];
        a[index] = a[i];
        a[i] = temp;
        
    }
    std::cout<<"The elements of the vector are:"<<std::endl;
    //print the element of the vector 
    for(const int& elem: a)
    {
        std::cout<<elem<<std::endl;
    }
    return 0;
} 

程序输出可见here.


1有关未定义行为的更准确的技术定义,请参阅 this 其中提到:没有对程序行为的限制.