while循环中的多个条件给出不同的结果

Multiple conditions in while loop giving different result

我在 while 循环中有两个条件:

count = 0;
while (j >= 0 && arr[j] > key)
       {
           count++;
           j = j-1;
       }

当我如下打破这两个条件时,计数发生变化:

while (j >= 0)
{
    if(arr[j] > key)
    {
        count++;
    }
    j = j-1;
}

第一个程序的输出:456

第二个程序的输出:904。

我认为这两段代码是相同的。为什么这两个程序的计数不同?

这两个版本在逻辑上并不等同。在第一个版本中,j 只有在两个条件都为真时才会递减。在第二个版本中 j 仅在第一个条件为真时才递减。 j在第二个版本中key比较失败时仍然会递减

因为j被用作计算循环条件的一部分,这直接影响循环执行的次数。

在第一个循环中,只有当arr[j] > key条件为true时,j才会减少。在第二个循环中,j 每一步都递减。假设 arr[0] < key 那么第一个循环将进行 0 次迭代,这个例子是这些循环差异的最好说明。

让我们检查两个循环:设 j = 10、设 key = 3arr[] = {1,2,3,4,5,6,7...}

在第一个循环中我们有这个模式:

count = 0;
while ( j >= 0 && arr[j] > key ) {
    count++; 
    j = j-1;
}

每一步输出:

while ( /*j = */ 10 >= 0 && /*arr[10] = */ 11 > 3 ) { // TRUE
    count++; // count becomes 1
    j = j-1; // j becomes 9
}

while ( 9 >= 0 && 10 > 3 ) { // TRUE
    count++; // count becomes 2
    j = j-1; // j becomes 8
}

while ( 8 >= 0 && 9 > 3 ) {  // TRUE
    count++; // count becomes 3
    j = j-1; // j becomes 7
}

while ( 7 >= 0 && 8 > 3 ) { // TRUE
    count++; // count becomes 4
    j = j-1; // j becomes 6
}

while ( 6 >= 0 && 7  > 3 ) { // TRUE
    count++; // count becomes 5
    j = j-1; // j becomes 5
}

while ( 5 >= 0 && 6 > 3 ) { // TRUE
    count++; // count becomes 6
    j = j-1; // j becomes 4
}

while ( 4 >= 0 && 5 > 3 ) { // TRUE
    count++; // count becomes 7
    j = j-1; // j becomes 3
}

while ( 3 >= 0 && 4 > 3 ) { // TRUE
    count++; // count becomes 8
    j = j-1; // j becomes 2
}

while ( 2 >= 0 && 3 > 3 ) { // FALSE 
    // loop breaks: First Condition TRUE, Second Condition FALSE
}

简化输出:

// Initial count = 0, j = 10, constant key = 3, arr[] = {1,2,3,4,5,6,7...}

count = 0  j = 10  arr[10] = 11 compound condition = true
count = 1  j = 9   arr[9]  = 10 compound condition = true
count = 2  j = 8   arr[8]  = 9  compound condition = true
count = 3  j = 7   arr[7]  = 8  compound condition = true
count = 4  j = 6   arr[6]  = 7  compound condition = true
count = 5  j = 5   arr[5]  = 6  compound condition = true
count = 6  j = 4   arr[4]  = 5  compound condition = true
count = 7  j = 3   arr[3]  = 4  compound condition = true
count = 8  j = 2   arr[2]  = 3  compound condition = false

count = 8 // 8 times it looped successfully

在第二个循环中我们有这个模式:

while (j >= 0) {
    if(arr[j] > key) {
        count++;
    }
    j = j-1;
}

使用与上面第一个循环相同的初始条件,其中 j = 10key = 3arr[] = {1,2,3,4,5,6,7...}...

让我们输出每一步:

while ( /*j = */ 10 >= 0 ) { // TRUE
    if( /*arr[10] = */ 11  > 3 ) {  // TRUE
        count++; // count becomes 1
    }
    j = j-1; // j becomes 9
}

while ( 9 >= 0 ) { // TRUE
    if ( 10 > 3 ) { // TRUE
        count++; // count becomes 2
    }
    j = j-1; // j becomes 8
}

while ( 8 >= 0 ) { // TRUE
    if ( 9 > 3 ) { // TRUE
        count++; // count becomes 3
    }
    j = j-1; // j becomes 7
}

while ( 7 >= 0 ) { // TRUE
    if ( 8 > 3 ) { // TRUE
        count++; // count becomes 4
    }
    j = j-1; // j becomes 6
}

while ( 6 >= 0 ) { // TRUE
    if ( 7 > 3 ) { // TRUE
        count++; // count becomes 5
    }
    j = j-1; // j becomes 5
}

while ( 5 >= 0 ) { // TRUE
    if ( 6 > 3 ) { // TRUE
        count++; // count becomes 6
    }
    j = j-1; // j becomes 4
}

while ( 4 >= 0 ) { // TRUE
    if ( 5 > 3 ) { // TRUE
        count++; // count becomes 7
    }
    j = j-1; // j becomes 3
}

while ( 3 >= 0 ) { // TRUE
    if ( 4 > 3 ) { // TRUE
        count++; // count becomes 8
    }
    j = j-1; // j becomes 2
}

while ( 2 >= 0 ) { // TRUE
    if ( 3 > 3 ) { // FALSE
        count++; // count DOES NOT INCREMENT
    }
    j = j-1; // j becomes 1
}

while ( 1 >= 0 ) { // TRUE
    if ( 2 > 3 ) { // FALSE
         count++; // count DOES NOT INCREMENT
    }
    j = j-1; // j becomes 0
}

while ( 0 >= 0 ) { // TRUE
    if ( 1 > 3 ) { // FALSE
        count++; // count DOES NOT INCREMENT
    }
    j = j-1; // j becomes -1
}

while( -1 >= 0 ) { // FALSE
    // Loop breaks since its only condition if false.
}

简化输出:

// Initial count = 0, j = 10, constant key = 3, arr[] = {1,2,3,4,5,6,7...}

count = 0  j = 10  arr[10] = 11 while condition = true  | if condition = true
count = 1  j = 9   arr[9]  = 10 while condition = true  | if condition = true
count = 2  j = 8   arr[8]  = 9  while condition = true  | if condition = true
count = 3  j = 7   arr[7]  = 8  while condition = true  | if condition = true
count = 4  j = 6   arr[6]  = 7  while condition = true  | if condition = true
count = 5  j = 5   arr[5]  = 6  while condition = true  | if condition = true
count = 6  j = 4   arr[4]  = 5  while condition = true  | if condition = true
count = 7  j = 3   arr[3]  = 4  while condition = true  | if condition = true
count = 8  j = 2   arr[2]  = 3  while condition = true  | if condition = false
count = 8  j = 1   arr[1]  = 2  while condition = true  | if condition = false
count = 8  j = 0   arr[0]  = 1  while condition = true  | if condition = false
count = 8  j = -1  NO EXECUTION  while condition = false | NO EXECUTION

count = 8; // 11 times it looped successfully.

这两个循环不一样,并且没有相同的行为。第二个 while 循环将比第一个 while 循环执行更多次。

对于第一种情况,您的陈述

count++;

j = j-1

两个条件同时执行 j >= 0arr[j] > key 为真。

但对于第二种情况,语句 j = j-1 将仅在 j>=0 为真且语句为真时执行count++ 将同时执行两个条件 j >= 0arr[j] > key 为真。 :)