2010-09-23 22 views
4

我只是想知道爲什麼這是允許的。爲什麼編譯多個分號的代碼?

int i=0;; 

我意外地打了那個。但程序編譯。我注意到它之後很多天我已經輸入;;

之後,我用不同的符號試圖像~, !, : etc etc

爲什麼不允許作爲第一個被允許在那裏。

只是好奇知道。

+0

大家問這個問題是C語言的語言不明白';'的意思。或者可能沒有正確解釋(「當你進行換行時,你必須輸入一個分號,這太神奇了!」)oO – delnan 2010-09-23 20:33:22

+0

';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (也是有效的語法) – 2010-09-23 20:39:17

+0

此外,''{{{{{{}}}}}}}}}}}}''是有效的語法,製作多個嵌套的作用域。 – 2010-09-23 22:03:21

回答

16

你輸入一個空聲明:

int i=0; // that's one statement 
; // that's another 

這是合法的,在C#中的語句有沒有身體。

C# Language Specification的第8.3節:

空語句什麼也不做。

空聲明:
;
如果在需要語句的上下文中沒有要執行的操作,則使用空語句。

+0

優秀!!!回答。 – 2010-09-23 20:44:30

+0

也是這樣;它自己被編譯器刪除還是插入noop? – 2010-09-23 23:27:47

+0

@熊:好問題。我不知道,但是來自同一規範部分的這一行 - 執行一個空語句只是將控制轉移到語句的終點。* - 使我傾向於NOP或類似語言。只有編譯的代碼纔會執 – 2010-09-23 23:42:52

1

額外的;只是標出了一個額外的,儘管空白,'行'的C#代碼。其他符號在他們自己放置時沒有意義。

0

因爲分號表示語句的結尾。其他人不。你可以有一個空白的聲明。

5

空語句實際上可能有用。看看這個有趣的無限循環示例:

for (;;) 
    { 
     // loops infinitely 
    } 

運行以下版本作爲證明,但與無限休息:

int count = 0; 
    for (;;) 
    { 
     count++; 
     if (count > 10) break; 
    } 

    Console.WriteLine("Done"); 

但是,如果你真的想要做一個無限循環,使用:while (true) {}而不是for (;;) {}。 while(真)不那麼簡潔,更易於閱讀並且無限期地容易地傳達循環的意圖。

1

C#(和很多其他語言)使用分號分隔語句,而不是關注換行符。空語句是有效的,所以你可以放置儘可能多的分號。這也意味着你可以在一行中放置多個語句,或者將多個語句分成多行 - 編譯器不會在意。