簡體   English   中英

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 個變量,它們被稱為imaxmin maxmin隱藏在循環外聲明的同名變量。

不要聲明同名的變量,而是使用您已經聲明的變量:

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 循環塊范圍的局部變量maxmin

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_posmin_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM