C ++ while循环即使条件变为假也不会终止

时间:2020-08-15 18:39:15

标签: c++ while-loop

我写了一个堆建立函数,可以在数组中建立最大堆。它从最后一个节点开始,并检查每个向上移动的节点。当前它在节点“ a”上,它检查左子节点和右子节点,如果它们存在并且值大于“ a”,则“ a”与最大的直接子节点交换,并一直持续到子树被堆积为止。我在细流向下部分使用了while循环。一直进行下去,直到任何子节点的值大于当前节点的值为止,或者至少应该如此。当我在这种情况下使用while循环时,循环永远不会终止。但是,如果我在while循环中放入具有相同条件的break if语句,则它会起作用。怎么了?

void buildHeap(int arr[], int n)  { 
    int m= n;
    
    while(m){
        int i= m;
        int l= (2*i<=n)?arr[2*i-1]:INT_MIN;
        int r= (2*i+1<=n)?arr[2*i]:INT_MIN;
      
        cout<<l<<" "<<r<<endl;
        while(arr[i-1]<l || arr[i-1]<r){     //  <--- This doesn't work
            cout<<i<<endl;
            if(l>r){
                arr[2*i-1]= arr[i-1];
                arr[i-1]= l;
                i= 2*i;
            }
            else{
                arr[2*i]= arr[i-1];
                arr[i-1]= r;
                i= 2*i+1;
            }
            
            int l= (2*i<=n)?arr[2*i-1]:INT_MIN;
            int r= (2*i+1<=n)?arr[2*i]:INT_MIN;
            cout<<(arr[i-1]<l || arr[i-1]<r)<<endl;
            //if(!(arr[i-1]<l || arr[i-1]<r)) break;     <--- This works
        }
        
        m--;
    }
    
    for(int i=0; i<n; i++)
        cout<<arr[i]<<" ";
    cout<<endl;
    
    return;
}

我使用了数组{1,2,3}的简单示例。以下是输出。

-2147483648 -2147483648       <--- l and r for node 3
-2147483648 -2147483648       <--- l and r for node 2
2 3                           <--- l and r for node 1
1                             <--- while loop starts here, i= 1
0                             <--- The value of while loop condition is 0. Still it doesn't terminate.
3                             <--- i= 3
0                             <--- Loop condition still false.
7
0
15
0
31
0
63
0
127
0
255
Segmentation fault (core dumped)

1 个答案:

答案 0 :(得分:4)

在循环中,您拥有

int l= (2*i<=n)?arr[2*i-1]:INT_MIN;
int r= (2*i+1<=n)?arr[2*i]:INT_MIN;

这将声明并初始化新变量lr,它们位于循环体的本地,与在循环外部声明的具有相同名称的变量不同且无关。这些“外部”变量保持不变。

您的带有break语句的注释行将检查“内部”变量,但是循环条件将检查“外部”变量。