我在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。
我认为这两个代码块是相同的。为什么这两个程序的计数会有所不同?
答案 0 :(得分:4)
这两个版本在逻辑上并不相同。在第一个版本中,j
仅在两个条件都为真时才会递减。在第二个版本中,j
仅在第一个条件为真时才递减。当第二个版本中的密钥比较失败时,j
仍然会减少。
因为j
用作计算循环条件的一部分,这直接影响循环执行的次数。
答案 1 :(得分:1)
在第一个循环j
仅在arr[j] > key
条件为true
时减少。在第二个循环j
减少每一步。假设arr[0] < key
然后第一个循环将进行0次迭代,这个例子就是这些循环差异的最好例证。
答案 2 :(得分:0)
让我们检查两个循环:让j = 10
,让key = 3
和arr[] = {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 = 10
,key = 3
和arr[] = {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循环执行更多次。
答案 3 :(得分:0)
对于第一种情况,你的陈述
计数++;
j = j-1
将在两个条件下执行 j&gt; = 0 和 arr [j]&gt;关键是真的。
但对于第二种情况,语句 j = j-1 仅在 j&gt; = 0 为真且语句 count ++ 时执行将在两个条件下执行 j&gt; = 0 和 arr [j]&gt;关键是真的。 :)