[英]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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.