2009-05-05 103 views
15
int main() 
{ 
    int var = 0;; // Typo which compiles just fine 
} 
+33

爲什麼他們是非法的?這就像在VB中創建一個空行非法。 – dreamlax 2009-05-05 11:46:30

+1

您無法比較兩種完全不同語言的規則,以驗證特定的語言設計選擇。 – sharkin 2009-05-05 11:51:05

+4

dreamlax的觀點(我認爲)是:有什麼危害? – 2009-05-05 11:52:39

回答

8

我不是語言設計師,但我給的答案是「爲什麼不呢?」從語言設計的角度來看,人們希望規則(即語法)儘可能簡單。

且不說 「空表述」 具有用途,即

爲(I = 0;我< INSANE_NUMBER;我++);

將死等待(不是一個很好的使用,但仍然使用)。

編輯:正如在這個答案的評論中指出的,任何編譯器值得它的鹽可能不是忙於在此循環等待,並優化它。但是,如果在頭部本身(除i ++之外)中有更多的東西(我奇怪地看到)使用數據結構遍歷,那麼我想你仍然可以構造一個空體的循環(通過使用/濫用「for」構造)。

3

最常見的情況是可能

int i = 0; 
for (/* empty*/; i != 10; ++i) { 
    if (x[i].bad) break; 
} 
if (i != 10) { 
    /* panic */ 
} 
0
while(1){ 
    ; /* do nothing */ 
} 

當你想坐下來,什麼也不做有很多次。事件/中斷驅動的嵌入式應用程序,或者當您不希望某個函數退出時(例如設置線程並等待第一個上下文切換時)。

例如: http://lxr.linux.no/linux+v2.6.29/arch/m68k/mac/misc.c#L523

10

這顯然所以我們可以說這樣的話

for(;;) { 
    // stuff 
} 

誰會活不下去了嗎?

6

我真的不知道這是否是真正的原因,但我認爲更有意義的是從編譯器實現者的角度思考它。

很大一部分編譯器是由分析特殊語法類的自動化工具構建的。看起來非常自然的是有用的語法會允許空語句。當它不改變你的代碼的語義時,它似乎是不必要的工作來檢測這樣的「錯誤」。空的語句不會做任何事情,因爲編譯器不會爲這些語句生成代碼。

在我看來,這僅僅是「不要修理那些不破」的結果......

31

時被定義NDEBUG否則怎麼能assert(foo == bar);編譯到什麼?

5

你希望能夠做的事情一樣

while (fnorble(the_smurf) == FAILED) 
    ; 

,而不是

while (fnorble(the_smurf) == FAILED) 
    do_nothing_just_because_you_have_to_write_something_here(); 

但是!請不要寫在同一行的空語句,就像這樣:

while (fnorble(the_smurf) == FAILED); 

這是混淆了讀者一個很好的方法,因爲它很容易錯過分號,因此認爲下一行是循環的主體。記住:編程實際上是關於溝通的 - 不是與編譯器,而是與其他人一起閱讀你的代碼。 (!還是對自己,三年後)

5

OK,我會添加這,你可以實際使用的最糟糕的情況:

for (int yy = 0; yy < nHeight; ++yy) 
{ 
    for (int xx = 0; xx < nWidth; ++xx) 
    { 
     for (int vv = yy - 3; vv <= yy + 3; ++vv) 
     { 
      for (int uu = xx - 3; uu <= xx + 3; ++uu) 
      { 
       if (test(uu, vv)) 
       { 
        goto Next; 
       } 
      } 
     } 

    Next:; 
    } 
} 
2

當使用「;」也請注意一件事。這是確定:

a ? b() : c(); 

然而,這不會編譯:

a ? b() : ; ; 
相關問題