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 个变量,它们分别称为 imaxminmaxmin 隐藏在循环外声明的同名变量。

不要声明同名变量,而是使用你已经声明的:

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