2016-12-18 28 views
0

我是Java新手。這是我的兩個代碼。連續if和nested之間有什麼不同?

1)。


if (!isCorrectGuess(guess) && !isPriorGuess(guess)){ 
     state += 1; 
    } 

    if(isCorrectGuess(guess) && !isPriorGuess(guess)){ 
     correctguess += guess; 
    } 

    if (!isPriorGuess(guess)){ 
     guessed += guess; 
    } 

    return isCorrectGuess(guess) && !isPriorGuess(guess); 

2)。


if (!isPriorGuess(guess)){ 
     guessed += guess; 
     if (isCorrectGuess(guess)){ 
      correctguess += guess; 
      return true; 
     } 
     else{ 
      state += 1; 
      return false; 
     } 
    } 
    return false; 

我覺得他們應該有相同的結果,但似乎我錯了。誰能告訴我這兩個代碼有什麼區別?謝謝!

這是我的作業,第一個代碼未通過測試,但第二個過去。

這裏是我的isCorrect和isPrior代碼:


public boolean isCorrectGuess(char guess) { 
    return guessWord.indexOf(guess) != -1; 
} 

public boolean isPriorGuess(char guess) { 
    return guessed.indexOf(guess) != -1; 
} 
+0

這是Java還是Javascript? (他們不一樣!)更重要的是,'isCorrectGuess(guess)'和'isPriorGuess(guess)'每次調用時都會返回相同的值?他們中的任何一個都有副作用,可能會改變'guess','state','correguess'或'guessed'的值? –

+0

_「但似乎我錯了」_ - 你爲什麼這麼說? –

+0

謝謝泰德!我認爲它應該是Java,我改變了標籤。這是我的家庭作業,我運行這兩個代碼,第一個測試失敗,但第二個代碼通過。我會發布我的isCorrectGuess和isPriorGuess。 – victor

回答

2

你的問題被標記爲Javascript,但你的問題說Java。他們根本不一樣,但我的答案對兩種語言都是一樣的。

假設isCorrectGuess()isPriorGuess()idempotent(每次被調用時的行爲相同),並具有無副作用,這兩種情況之間的唯一區別(據我可以告訴)的次數和順序其中調用了這兩個函數。對各種變量和返回值的影響似乎是相同的。

編輯您對問題的編輯解釋了爲什麼這兩種情況不一樣。對isPriorGuess()的呼叫依賴於當前值guessed,其隨着情況1和情況2的執行而改變。具體而言,假設在任一情況執行之前,isPriorGuess(guess)返回false並且isCorrectGuess(guess)返回true。然後在情況1,代碼

if (!isPriorGuess(guess)){ 
    guessed += guess; 
} 

改變的guessed值,以便在後續調用,isPriorGuess(guess)將返回true。結果,當執行return聲明:

return isCorrectGuess(guess) && !isPriorGuess(guess); 

返回值將始終是false(無論是isCorrectGuess(guess)回報falseisPriorGuess(guess)將返回true)。在情況2中,這不會發生,因爲isPriorGuess(guess)只被調用一次(並且isCorrectGuess(guess)被稱爲0或1次,具體取決於isPriorGuess(guess)的值)。

+0

謝謝泰德!我認爲它應該是Java,我改變了標籤。 – victor

+0

我明白了。謝謝! – victor

+0

@victor - 這種錯誤很難追查到。避免它的一種技術是重新設計'isPriorGuess()'和'isCorrectGuess()'來接收它們需要的所有值作爲參數,而不是依賴於可能在調用之間改變的字段。這將使情況1中顯而易見的是,這些方法在不同的調用中接收到不同的信息(或者至少,isPriorGuess()是)。 –

0

在第一個例子保守的,如果每個if條件進行評估,如果真的是身體會被執行,但在嵌套if if條件評估真的,否則將不會被檢查。

+0

這不回答OP的問題:對變量和返回值的變化有什麼結果? –

相關問題