for循环C++内外的值不同
the value is different inside and outside the for-loop C++
我是 C++ 初学者,我想编写一个程序,将数组中的最大值替换为最小值,反之亦然。
#include<iostream>
using namespace std;
int main(){
int num, arr[200],max,min,max_pos,min_pos;
cout <<"enter array size: ";
cin >> num;
for (int i=0; i<num; i++){
cout<<"Enter a value in array position "<<i<<" : ";
cin>>arr[i];
}
for(int i=1, max=arr[0], min=arr[0]; i<num; i++){
if(arr[i]>arr[i-1] && arr[i]>max){
max = arr[i];
max_pos = i;
}
if(arr[i]<arr[i-1] && arr[i]<min){
min = arr[i];
min_pos = i;
}
cout<<"max_in "<<max<<"||"<<"min_in "<<min<<endl;
}
cout<<"max_out "<<max<<"||"<<"min_out "<<min<<endl;
// arr[min_pos] = max;
// arr[max_pos] = min;
// cout<<"max: "<<arr[min_pos]<<" || min: "<<arr[max_pos];
// cout<<"array is ";
// for(int i =0; i<num;i++){
// cout<<arr[i];}
}
这是输出
enter how many number you want inside :4
Enter a value in array position 0 : 2
Enter a value in array position 1 : 1
Enter a value in array position 2 : 4
Enter a value in array position 3 : 6
max_in 2||min_in1
max_in 4||min_in1
max_in 6||min_in1
max 561||min -1343285512
我不知道为什么值在循环外发生变化,错误在哪里?
这里
for (int i=1, max=arr[0], min=arr[0] ;...
您声明了 3 个变量,它们分别称为 i
、max
和 min
。 max
和 min
隐藏在循环外声明的同名变量。
不要声明同名变量,而是使用你已经声明的:
int max = arr[0];
int min = arr[0];
for(int i=1; i<num; i++){
这是一个您可以通过阅读编译器警告来避免的错误:https://godbolt.org/z/aT753e4nh。同样总是初始化变量,并且只在可以初始化变量时才声明变量,这样可以减少发生此类错误的机会。
在这个for循环中
for(int i=1, max=arr[0], min=arr[0]; i<num; i++){
if(arr[i]>arr[i-1] && arr[i]>max){
max = arr[i];
max_pos = i;
}
if(arr[i]<arr[i-1] && arr[i]<min){
min = arr[i];
min_pos = i;
}
cout<<"max_in "<<max<<"||"<<"min_in "<<min<<endl;
}
您在 for 循环的块范围内声明了局部变量 max
和 min
for(int i=1, max=arr[0], min=arr[0]; i<num; i++){
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
隐藏函数块范围内声明的同名变量main
int num, arr[200],max,min,max_pos,min_pos;
^^^^^^^
您需要去掉for循环中多余的声明,并初始化忘记初始化的变量max_pos
和min_pos
max=arr[0]; min=arr[0];
max_pos = 0; min_pos = 0;
for(int i=1; i<num; i++){
另外if语句中的条件可以写得更简单
if( arr[i]>max){
max = arr[i];
max_pos = i;
}
else if( arr[i]<min){
min = arr[i];
min_pos = i;
}
注意可以使用标准算法 std::minmax_element
代替 for 循环。
例如
#include <algorithm>
//...
auto p = std::minmax_element( arr, arr + num );
if ( p.first != p.second ) std::iter_swap( p.first, p.second );
这是一个演示程序。
#include <iostream>
#include <algorithm>
int main()
{
enum { num = 10 };
int arr[num] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (size_t i = 0; i < num; i++)
{
std::cout << arr[i] << ' ';
}
std::cout << '\n';
auto p = std::minmax_element( arr, arr + num );
if (p.first != p.second) std::iter_swap( p.first, p.second );
for (size_t i = 0; i < num; i++)
{
std::cout << arr[i] << ' ';
}
std::cout << '\n';
}
程序输出为
0 1 2 3 4 5 6 7 8 9
9 1 2 3 4 5 6 7 8 0
我是 C++ 初学者,我想编写一个程序,将数组中的最大值替换为最小值,反之亦然。
#include<iostream>
using namespace std;
int main(){
int num, arr[200],max,min,max_pos,min_pos;
cout <<"enter array size: ";
cin >> num;
for (int i=0; i<num; i++){
cout<<"Enter a value in array position "<<i<<" : ";
cin>>arr[i];
}
for(int i=1, max=arr[0], min=arr[0]; i<num; i++){
if(arr[i]>arr[i-1] && arr[i]>max){
max = arr[i];
max_pos = i;
}
if(arr[i]<arr[i-1] && arr[i]<min){
min = arr[i];
min_pos = i;
}
cout<<"max_in "<<max<<"||"<<"min_in "<<min<<endl;
}
cout<<"max_out "<<max<<"||"<<"min_out "<<min<<endl;
// arr[min_pos] = max;
// arr[max_pos] = min;
// cout<<"max: "<<arr[min_pos]<<" || min: "<<arr[max_pos];
// cout<<"array is ";
// for(int i =0; i<num;i++){
// cout<<arr[i];}
}
这是输出
enter how many number you want inside :4
Enter a value in array position 0 : 2
Enter a value in array position 1 : 1
Enter a value in array position 2 : 4
Enter a value in array position 3 : 6
max_in 2||min_in1
max_in 4||min_in1
max_in 6||min_in1
max 561||min -1343285512
我不知道为什么值在循环外发生变化,错误在哪里?
这里
for (int i=1, max=arr[0], min=arr[0] ;...
您声明了 3 个变量,它们分别称为 i
、max
和 min
。 max
和 min
隐藏在循环外声明的同名变量。
不要声明同名变量,而是使用你已经声明的:
int max = arr[0];
int min = arr[0];
for(int i=1; i<num; i++){
这是一个您可以通过阅读编译器警告来避免的错误:https://godbolt.org/z/aT753e4nh。同样总是初始化变量,并且只在可以初始化变量时才声明变量,这样可以减少发生此类错误的机会。
在这个for循环中
for(int i=1, max=arr[0], min=arr[0]; i<num; i++){
if(arr[i]>arr[i-1] && arr[i]>max){
max = arr[i];
max_pos = i;
}
if(arr[i]<arr[i-1] && arr[i]<min){
min = arr[i];
min_pos = i;
}
cout<<"max_in "<<max<<"||"<<"min_in "<<min<<endl;
}
您在 for 循环的块范围内声明了局部变量 max
和 min
for(int i=1, max=arr[0], min=arr[0]; i<num; i++){
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
隐藏函数块范围内声明的同名变量main
int num, arr[200],max,min,max_pos,min_pos;
^^^^^^^
您需要去掉for循环中多余的声明,并初始化忘记初始化的变量max_pos
和min_pos
max=arr[0]; min=arr[0];
max_pos = 0; min_pos = 0;
for(int i=1; i<num; i++){
另外if语句中的条件可以写得更简单
if( arr[i]>max){
max = arr[i];
max_pos = i;
}
else if( arr[i]<min){
min = arr[i];
min_pos = i;
}
注意可以使用标准算法 std::minmax_element
代替 for 循环。
例如
#include <algorithm>
//...
auto p = std::minmax_element( arr, arr + num );
if ( p.first != p.second ) std::iter_swap( p.first, p.second );
这是一个演示程序。
#include <iostream>
#include <algorithm>
int main()
{
enum { num = 10 };
int arr[num] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (size_t i = 0; i < num; i++)
{
std::cout << arr[i] << ' ';
}
std::cout << '\n';
auto p = std::minmax_element( arr, arr + num );
if (p.first != p.second) std::iter_swap( p.first, p.second );
for (size_t i = 0; i < num; i++)
{
std::cout << arr[i] << ' ';
}
std::cout << '\n';
}
程序输出为
0 1 2 3 4 5 6 7 8 9
9 1 2 3 4 5 6 7 8 0