2017-03-10 43 views
-2

我需要的代碼運行,直到在當兩個條件都爲真,我使用邏輯AND(& &):While循環有兩個真正的條件,但它只是驗證一個

while ((A.i != B.i) && (A.j != B.j)) 
{ 
    // do something 
} 

在運行,循環停止,如果

A.i=B.i 

沒有檢查第二個條件,我做錯了什麼?

+0

如果'A.i = B.i'則兩個條件都不成立。 –

+0

@DourHighArch怎麼樣? – BackDoorNoBaby

+0

因爲'A.i!= B.i'是錯誤的,所以至少有一個條件不成立。如果一個條件不成立,那麼這兩個條件都不成立。 –

回答

4

在使用&&運算符的條件語句中,僅在第一個條件爲true時評估第二個條件。這就是爲什麼當A.i==B.i你馬上打出來的支票

的「我需要的代碼運行,直到在當兩個條件都爲真」

這讓我困惑,因爲如果你想有一個while循環運行直到一定條件true,那麼你就不會想這些條件在while()聲明進行評估..

如果你希望你的代碼運行UNTIL這兩方面的條件爲真,那麼它真的應該是:

// Keep running while EITHER A.i is equal to B.i OR A.j is equal to B.j 
while ((A.i == B.i) || (A.j == B.j)) 
{ 
    // do something 
} 
+0

你翻轉他的!= ==在這裏或者這裏打破了 – BradleyDotNET

+0

OP說他希望循環運行,直到滿足這些條件,所以他基本上說他想要循環運行,直到'Ai不等於Bi並且Aj不等於Bj',這就是循環檢查的內容。如果'Ai == Bi'或'Aj == Bj'循環將繼續 – BackDoorNoBaby

3

切換您&&||

你的循環說 「而A.I不等於B.i和A.J不等於B.j」 循環。一旦A.i等於B.i該語句不再是真的,所以循環退出(它實際上並不關心該點的第二個等式)。通過使用OR,它會循環直到兩個條件都是假的。

+0

我看到你的點.. –

0

因爲愛!=碧計算結果爲false,所以沒有需要完成的條件

1

尚不清楚,但我懷疑這是你在找什麼

while (!(A.i == B.i && A.j == B.j)) 

這是一樣的

while (A.i != B.i || A.j != B.j)) 

我覺得呢?

1

OP,你的問題不是很清楚,但我敢肯定,你遇到了兩個問題之一。

  1. 這是一個非常普遍的邏輯錯誤

    while (a == b) || (c == d) 
    

    相同

    until (a != b) && (c != d) 
    

    同時,

    while (a != b) && (c != d) 
    

    相同

    until (a == b) || (c == d) 
    

    注意如何當你從==切換到!=,還需要切換&&||。很多開發者錯過了這種非常明顯的邏輯翻轉(參見De Morgan's Laws)。無論如何,你只需要考慮邏輯。從你的帖子,目前還不清楚你的意圖,但你可能只需要切換&&||

  2. 短路評價

    聽起來像是你想要的邏輯下半年跑,也許是因爲j吸氣劑有你想要一些副作用(其中的方式是不是一個好主意) 。

    如果您希望後半部分始終運行,則應該使用|而不是||。如果左側爲真,則||操作員不會打擾右側。同樣,如果左側爲假,則&&操作員不打擾右側。這叫做Short-circuit evaluation