if(cond1)
if(cond2) DoCond2();
else DoCond3();
請問else
聲明被視爲第一if
或第二if
的別的嗎?爲什麼? (有沒有從句法的角度來解釋?) 其他基於C的編程語言(如C和Java)的答案也是一樣的嗎?
注意:這不是作業。我可以很容易地測試它,如果我不喜歡默認行爲,可以使用大括號,但我很好奇原因。
編輯夥計們,顯然在最初的例子中有一個非常嚴重的錯誤。請再檢查一次。我知道,這很尷尬。抱歉。
if(cond1)
if(cond2) DoCond2();
else DoCond3();
請問else
聲明被視爲第一if
或第二if
的別的嗎?爲什麼? (有沒有從句法的角度來解釋?) 其他基於C的編程語言(如C和Java)的答案也是一樣的嗎?
注意:這不是作業。我可以很容易地測試它,如果我不喜歡默認行爲,可以使用大括號,但我很好奇原因。
編輯夥計們,顯然在最初的例子中有一個非常嚴重的錯誤。請再檢查一次。我知道,這很尷尬。抱歉。
按MSDN
在嵌套if語句,else子句屬於過去,如果不具備相應的東西。
此外,還可以對C和C++進行條件評估,其中0的結果爲false並且其他任何數字爲真。在C#,條件必須評估爲布爾值真/假
EDIT 作爲每編輯其嵌套如果,所以內一個爲真時評估並仍然在else與內如果
你能看到我的編輯,謝謝! –
也許明白這一點,將是加括號有用:
if(cond1) {
DoCond1();
}
if(cond2) {
DoCond2();
} else {
DoCond3();
}
如果有if
或else
後無括號,只有第一條語句(在這種情況下DoCondX
)屬於的if/else塊。在代碼
編輯展望編輯後:
if(cond1) {
if(cond2) {
DoCond2();
} else {
DoCond3();
}
}
添加括號明確說明了結果。這裏的括號與原來的代碼完全一樣。 –
添加大括號是我總是這樣做的(有時候還是這樣),當一些代碼不明確:) –
你能看到我的編輯請,謝謝! –
將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 if
BASIC變體或Python的if
s規則等明確聲明的原因之一。
您能否看到我的編輯,謝謝! –
@Louis:這完全改變你的問題:)將盡我所能編輯... –
是的,真的很抱歉。在閱讀答案後才意識到我的錯誤。 –
讓我們來澄清if
語句的工作原理。
的if
條款後,你可以有兩件事情:
單線語句是像你所提供的兩個例子。在這種情況下,else
只有在它後面(如第二個示例)時才屬於if
。
多行語句在if語句後面會有大括號{ }
。在右括號之後的else
使其屬於該聲明。
您可以使用else if
語法「鏈接」if
語句。下面的if如果表現得像一個普通的if,但只有在前面的if
返回false時纔會被檢查。在你的例子中,兩個if
語句都將被檢查爲無關結果。
在技術上,'else'在兩個'if'之後都是「直接」,因爲兩個if在同一個點。 –
不可以。正如我寫的,單行語句是「單行」,這意味着在第一個分號後,語句完成,除非它直接跟隨其他語句。在你的情況下,它是由另一個如果。 –
糟糕。對不起,我在這個例子中犯了一個嚴重的錯誤。改變它以顯示我的意思。我很尷尬 –
您可以在網上爲自己測試一下:http://codepad.org/,http://compilr.com/ –
供參考:這也被稱爲[dangling else](http://en.wikipedia .org/wiki/Dangling_else)問題。 – fretje
總是添加大括號,那麼你永遠不會想知道。 –