2011-07-01 10 views
1

例如:C#中兩個if和另外一個。怎麼了?

if(cond1) 
if(cond2) DoCond2(); 
else DoCond3(); 

請問else聲明被視爲第一if或第二if的別的嗎?爲什麼? (有沒有從句法的角度來解釋?) 其他基於C的編程語言(如C和Java)的答案也是一樣的嗎?

注意:這不是作業。我可以很容易地測試它,如果我不喜歡默認行爲,可以使用大括號,但我很好奇原因。

編輯夥計們,顯然在最初的例子中有一個非常嚴重的錯誤。請再檢查一次。我知道,這很尷尬。抱歉。

+0

您可以在網上爲自己測試一下:http://codepad.org/,http://compilr.com/ –

+6

供參考:這也被稱爲[dangling else](http://en.wikipedia .org/wiki/Dangling_else)問題。 – fretje

+2

總是添加大括號,那麼你永遠不會想知道。 –

回答

4

MSDN

在嵌套if語句,else子句屬於過去,如果不具備相應的東西。

此外,還可以對C和C++進行條件評估,其中0的結果爲false並且其他任何數字爲真。在C#,條件必須評估爲布爾值真/假

EDIT 作爲每編輯其嵌套如果,所以內一個爲真時評估並仍然在else與內如果

+0

你能看到我的編輯,謝謝! –

1

也許明白這一點,將是加括號有用:

if(cond1) { 
    DoCond1(); 
} 
if(cond2) { 
    DoCond2(); 
} else { 
    DoCond3(); 
} 

如果有ifelse後無括號,只有第一條語句(在這種情況下DoCondX)屬於的if/else塊。在代碼

編輯展望編輯後:

if(cond1) { 
    if(cond2) { 
     DoCond2(); 
    } else { 
     DoCond3(); 
    } 
} 
+0

添加括號明確說明了結果。這裏的括號與原來的代碼完全一樣。 –

+0

添加大括號是我總是這樣做的(有時候還是這樣),當一些代碼不明確:) –

+0

你能看到我的編輯請,謝謝! –

2

將else語句被視爲第一,如果還是第二,如果的別的嗎?

編輯(刪除的內容,我原來說在這裏 - 它不適用):

用這樣的結構,我不能告訴你。每種語言的語法都是不明確的。

但我個人猜測它會「貼」到最接近的if。否則,幾乎不可能有人閱讀。

我說試試看,但最好的解決方案是應用,從以往任何時候都這樣做,禁止人們一個編碼標準......

爲什麼? (有沒有從句法的角度來解釋?)

您可以查看每種語言的(經常是非官方的)語法定義,以瞭解爲什麼這些語句與他們的方式掛在一起。

(舊)官方C#語法:

http://msdn.microsoft.com/en-us/library/aa645596(v=VS.71).aspx

編輯:但它不會幫助你多少,因爲在這種情況下,文法類C語言要求方面,還是故意變通。

參見:http://en.wikipedia.org/wiki/Dangling_else#Context_Free_Solutions

就是答案也在其他基於C語言的編程語言如C和Java一樣的嗎?

語法是複雜的事情,並且正確地嵌套作用域有點困難。但總的來說,答案通常圍繞着block s和statement s的定義。

您可以將statement定義爲以;結尾的行。然後將block定義爲由{}包圍的一系列statement

因此,您可以將您的if語句定義爲if block-or-statement [else block-or-statement][]表示它是可選的。

編輯:這個定義的問題是,這樣的語法要求方面,只有解決了與原制定你的問題的問題。如果它確實含糊不清(作爲新的編輯版本),則必須具有更高級別的處理(上下文)來處理歧義。

C++,例如:

,去年文檔中有幾次,你會看到 「dangling else」。這具體描述了你在找什麼。

這個問題存在於很多語言中,而不僅僅是C-likes。這是您看到end ifBASIC變體或Pythonif s規則等明確聲明的原因之一。

+0

您能否看到我的編輯,謝謝! –

+0

@Louis:這完全改變你的問題:)將盡我所能編輯... –

+0

是的,真的很抱歉。在閱讀答案後才意識到我的錯誤。 –

1

讓我們來澄清if語句的工作原理。

if條款後,你可以有兩件事情:

  • 單行聲明
  • 多行語句

單線語句是像你所提供的兩個例子。在這種情況下,else只有在它後面(如第二個示例)時才屬於if

多行語句在if語句後面會有大括號{ }。在右括號之後的else使其屬於該聲明。

您可以使用else if語法「鏈接」if語句。下面的if如果表現得像一個普通的if,但只有在前面的if返回false時纔會被檢查。在你的例子中,兩個if語句都將被檢查爲無關結果。

+0

在技術上,'else'在兩個'if'之後都是「直接」,因爲兩個if在同一個點。 –

+0

不可以。正如我寫的,單行語句是「單行」,這意味着在第一個分號後,語句完成,除非它直接跟隨其他語句。在你的情況下,它是由另一個如果。 –

+0

糟糕。對不起,我在這個例子中犯了一個嚴重的錯誤。改變它以顯示我的意思。我很尷尬 –