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**.
在上面的语句中,您正在创建一个名为 n
的 int
,但是由于您没有明确地初始化它,它拥有一个 不确定的值 。
接下来,您将该垃圾值用作数组的大小 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 其中提到:没有对程序行为的限制.
我正在用 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**.
在上面的语句中,您正在创建一个名为 n
的 int
,但是由于您没有明确地初始化它,它拥有一个 不确定的值 。
接下来,您将该垃圾值用作数组的大小 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 其中提到:没有对程序行为的限制.