2017-10-22 538 views
2

我在while循環的兩個條件爲:多個條件給予不同的結果

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

當我打破了這兩個條件下,計數得到改變:

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

輸出從第一程序:904

我想THES:從第二程序456

輸出兩個代碼塊是相同的。爲什麼計數在這兩個程序上有所不同?

+1

兩個循環不相同。第一個循環只在兩個條件成立時才執行。 –

+0

使用調試器逐步完成並查看行爲的不同之處。 – chris

+0

什麼讓你覺得它們是相同的?標籤垃圾郵件是什麼? – shmosel

回答

4

這兩個版本在邏輯上並不相同。在第一個版本中,j只有在兩個條件都爲真時纔會遞減。在第二個版本j只有在第一個條件爲真時纔會遞減。當第二個版本中的密鑰比較失敗時,j仍然會遞減。

因爲j被用作計算循環條件的一部分,這直接影響循環執行的次數。

1

在第一個循環中,j僅在arr[j] > key條件爲true時減少。在第二個循環中,每步減少j。假設arr[0] < key,那麼第一個循環將進行0次迭代,這個例子是這些循環差異的最佳例證。

0

在您的第一個條件中,j遞減並且計數遞增,而j> = 0 & & arr [j]>鍵。但在第二種情況下,當j> = 0時,j遞減,但只有在arr [j]>鍵時遞增計數,這意味着每當流進入while循環時,j遞減1,而不是計數的情況。

+1

在第二個版本的'if'中減少'j'會導致無限循環,因爲一旦比較失敗,現在循環以'j'不變,一遍又一遍地重複。 –

+0

是的。沒有注意到那部分..改變了我的答案 –

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循環執行更多次。

0

對於第一種情況你的陳述

count ++;

當J = J-1

將同時兼具條件 Ĵ> = 0ARR [J]>鍵爲真來執行。

但對於第二種情況下,語句當J = J-1將被執行僅在Ĵ> = 0爲真並且聲明計數++將被執行,而雙方的條件 Ĵ> = 0arr [j]>鍵是正確的。 :)

相關問題