2014-12-19 56 views
0

我總是假定如果一個語句被聲明爲false,如boolean valid = false,那麼編寫!valid將反過來反轉valid爲真。但是,這是完全錯誤的錯誤觀念嗎?例如,在下面的代碼中;在false上使用not語句boolean

for (int check=3; check <= primeLimit; check += 2) { 
    boolean divisorFound=false; 
    for (int div=3; div<=Math.sqrt(check) && !divisorFound; div += 2) { 
     if (check%div==0) 
      divisorFound=true; 
    } 

循環搜索divisorFound的第二個錯誤是否爲真? 因爲如果有人暗示除數是假的,是不是隻是說:

div<=Math.sqrt(check) && divisorFound; 
+1

這裏的for循環搜索!divisorFound爲了停止,所以它搜索divisorFound爲true來停止。 建議; for循環專門用於重複n次。要使用布爾變量,while循環更有用。 – 2014-12-19 00:35:43

+0

@pbabcdefp,謝謝你,這正是我想澄清的。我很尷尬地問這個問題,因爲它似乎很瑣碎,但雙重否定總是讓我困惑。我認爲這段代碼意味着爲了循環運行,divisorFound必須是假的,但它只是說它會運行,直到有一個條件使得divisorFound爲真。 – kris 2014-12-19 00:53:28

+2

沒關係。簡單的問題沒有錯。我總是犯一些基本的錯誤 - 我不得不刪除我的評論,因爲它包含了一個非常令人尷尬的錯誤。我建議你使用'System.out.println(...)'來跟蹤變量,看看發生了什麼。這是一種非常有效的學習方式。 – 2014-12-19 00:59:54

回答

5

我假設你沒有寫這個代碼,並試圖瞭解它的目的是什麼。內循環應該繼續,直到找到除數。因此它會重複檢查!divisorFound的計算結果是否爲true。換句話說,「除了還沒有找到?」。

一旦除數被發現,divisorFound設置爲true和表達!divisorFound的計算結果爲false,因此該循環將停止。

如果使用的是你提出的條件檢查:

div<=Math.sqrt(check) && divisorFound 

循環體永遠不會被達到。 divisorFoundfalse開始以便繼續條件將立即失敗,循環將終止。

1

第二個循環說當div小於Math.sqrt(check)並且沒有找到除數時繼續循環。當divisorFound已設置爲true時,內部循環將失敗其條件。

我認爲你必須誤讀代碼,因爲這是一個非常直接的布爾條件。