int main()
{
int var = 0;; // Typo which compiles just fine
}
回答
這是C和C++的表達方式NOP。
我不是語言設計師,但我給的答案是「爲什麼不呢?」從語言設計的角度來看,人們希望規則(即語法)儘可能簡單。
且不說 「空表述」 具有用途,即
爲(I = 0;我< INSANE_NUMBER;我++);
將死等待(不是一個很好的使用,但仍然使用)。
編輯:正如在這個答案的評論中指出的,任何編譯器值得它的鹽可能不是忙於在此循環等待,並優化它。但是,如果在頭部本身(除i ++之外)中有更多的東西(我奇怪地看到)使用數據結構遍歷,那麼我想你仍然可以構造一個空體的循環(通過使用/濫用「for」構造)。
最常見的情況是可能
int i = 0;
for (/* empty*/; i != 10; ++i) {
if (x[i].bad) break;
}
if (i != 10) {
/* panic */
}
while(1){
; /* do nothing */
}
當你想坐下來,什麼也不做有很多次。事件/中斷驅動的嵌入式應用程序,或者當您不希望某個函數退出時(例如設置線程並等待第一個上下文切換時)。
例如: http://lxr.linux.no/linux+v2.6.29/arch/m68k/mac/misc.c#L523
這顯然所以我們可以說這樣的話
for(;;) {
// stuff
}
誰會活不下去了嗎?
我真的不知道這是否是真正的原因,但我認爲更有意義的是從編譯器實現者的角度思考它。
很大一部分編譯器是由分析特殊語法類的自動化工具構建的。看起來非常自然的是有用的語法會允許空語句。當它不改變你的代碼的語義時,它似乎是不必要的工作來檢測這樣的「錯誤」。空的語句不會做任何事情,因爲編譯器不會爲這些語句生成代碼。
在我看來,這僅僅是「不要修理那些不破」的結果......
時被定義NDEBUG
否則怎麼能assert(foo == bar);
編譯到什麼?
你希望能夠做的事情一樣
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);
這是混淆了讀者一個很好的方法,因爲它很容易錯過分號,因此認爲下一行是循環的主體。記住:編程實際上是關於溝通的 - 不是與編譯器,而是與其他人一起閱讀你的代碼。 (!還是對自己,三年後)
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:;
}
}
當使用「;」也請注意一件事。這是確定:
a ? b() : c();
然而,這不會編譯:
a ? b() : ; ;
- 1. 什麼是「var cc = cc = cc || {};」在Cocos2D中做什麼?
- 2. Zend Framework:爲什麼空白符合我的正則表達式?
- 3. 在SOLR中刪除空格的正則表達式是什麼
- 4. 中綴表示法解析表達式的算法是什麼?
- 5. 什麼是語法表達式?
- 6. 爲什麼在這個正則表達式中匹配空行?
- 7. 什麼是lambda表達式?
- 8. CoffeeScript中的非表達式是什麼?
- 9. 爲什麼JavaScript中的if()表達式中存在var是非法的?
- 10. (。)+在正則表達式中的行爲是什麼?
- 11. 在Makefile中,CC?=是什麼意思?
- 12. 這是什麼JavaScript語法:{Ci,CC}?
- 13. 什麼是+ X在表達式$ {GC_TUNE + X}
- 14. 是什麼?你在正則表達式
- 15. 爲什麼在正則表達式中無法正常工作?
- 16. 在Ilist中使用Func,爲什麼是lambda表達式?
- 17. 爲什麼不是?在正則表達式中工作?
- 18. 爲什麼賦值不總是在Angular表達式中工作?
- 19. 爲什麼這不是在正則表達式中工作?
- 20. (call/cc):什麼是延續?
- 21. 爲什麼正則表達式稱爲「常規」表達式?
- 22. 爲什麼正則表達式是不是在
- 23. 空的正則表達式匹配紅寶石是什麼?
- 24. 什麼是空終止ASCII字符串的正則表達式?
- 25. 正則表達式中'\ G'錨的用法是什麼?
- 26. 爲什麼ListBox中的選定項在表達式混合中拋出錯誤?
- 27. 爲什麼我的正則表達式不匹配空間
- 28. 爲什麼我的正則表達式刪除空格?
- 29. 什麼是符合文化名稱的正則表達式?
- 30. 什麼正則表達式會是合適的?
爲什麼他們是非法的?這就像在VB中創建一個空行非法。 – dreamlax 2009-05-05 11:46:30
您無法比較兩種完全不同語言的規則,以驗證特定的語言設計選擇。 – sharkin 2009-05-05 11:51:05
dreamlax的觀點(我認爲)是:有什麼危害? – 2009-05-05 11:52:39