2012-07-30 81 views
-4

我有一些奇怪的邏輯事情正在進行。在while循環進入條件下的c#邏輯錯誤

x=false; 

這一個工作:

while (R2.TS("a") && R2.TL("b") && (s=R2.SL().Trim()).Length > 0) 
{ 
    x=true; 
} 

結果:X = FALSE;

這一個確實工作:

while (R2.TS("a") && R2.TL("b")) 
{ 
    if((s=R2.SL().Trim()).Length > 0) 
    { 
     x=true; 
    } 
} 

結果:X =真;如果R2.TS(「a」)然後是R2.TL(「b」),然後((s = R2.SL)),那麼這些函數只有在以正確的順序執行時纔會返回true, ().Trim())。Length> 0)。

輸入是一樣的,但事情肯定是錯在這裏。有任何想法嗎 ?

在此先感謝。

+0

你是什麼意思的「不工作」?你得到的錯誤是什麼? – 2012-07-30 22:32:37

+0

正如你所看到的那樣,dosnt將x變爲true,理論上它應該如此。我沒有得到任何錯誤。 – 2012-07-30 22:33:50

+4

您的標題暗示這是編譯時錯誤,但您的評論表明這是一個運行時錯誤。請澄清。 – 2012-07-30 22:35:22

回答

-1

它可能連接& &和||操作。他們被縮短了。這意味着,操作會持續查看,直到條件中出現第一個false

由於運行時間縮短,您會得到2個不同的週期,它們有不同的邏輯。使用2種循環類型。這是更正確的。

+0

我不認爲這解釋了它。第一個循環先前終止的兩種情況之間唯一的真正區別。 – Zong 2012-07-30 22:37:57

+0

@宗立:是的,它早點結束。這一定是問題所在。因爲如果'(s = R2.SL()。Trim()).length> 0'在第一個週期結果爲false,它將退出。如果循環體中有一個if,那麼只有在R2.TS(「a」)&& R2.TL(「b」)「結果爲」false「時它纔會終止。這是唯一的原因。 2碼之間的差別僅在於此,所以可能不會有其他解釋。 – HeM01 2012-07-30 22:45:10

+0

是的,這就是爲什麼我沒有得到它,輸入是相同的,但仍然在第一種情況下它dosnt達到x。 – 2012-07-30 22:55:40

0

在第一種情況下,R2必須遵守三個條件,即R235(T) .Length> 0)之前,你將進入循環,並返回的值x

在第二種情況下,你只有兩個條件,R2必須符合,即 R2.TS(「a」)和R2。 TL(「b」),並且在循環輸入之後,在返回x值之前有一個新條件。

他們可能都工作,但在第一種情況下,您不提供符合循環要求的數據。

1

使用調試器盧克。我們試圖弄清楚爲什麼這不會給你想要的結果。你最好在一些幫助下解決這個問題。點擊第一行並按F9。它應該變成紅色。運行你的程序,它會停在這一行。然後,您可以將鼠標懸停在不同的變量上,查看哪些具有哪些值。然後按F11以通過您的程序前進。

3

是的,循環做兩件不同的事情。

我想你指的是邏輯錯誤,而不是一個語法錯誤。語法錯誤意味着它不會編譯。邏輯錯誤意味着它不符合你的期望。

如果R2.SL()表達式爲false,則第一個將終止。至少第一次,(s=R2.SL().Trim()).Length > 0必須是假的,所以循環1終止,並且x從不設置爲真。這是您在兩個循環之間獲得差異的唯一方式,其他所有條件都相同。

在循環2中,如果其他循環條件保持爲真,則R2.SL()的中間值不成問題。當(s=R2.SL().Trim()).Length > 0評估爲真時,將會設置x