可能重複:
No loop condition in for and while loop爲什麼可以將for循環的條件留空?
爲什麼在for-loop
條件允許爲空?例如
for (;;)
編譯正常。爲什麼這個空表達式計算爲true
但以下
if() {}
while() {}
都將失敗?我想知道如果/爲什麼for-loop
是這種情況的例外。
可能重複:
No loop condition in for and while loop爲什麼可以將for循環的條件留空?
爲什麼在for-loop
條件允許爲空?例如
for (;;)
編譯正常。爲什麼這個空表達式計算爲true
但以下
if() {}
while() {}
都將失敗?我想知道如果/爲什麼for-loop
是這種情況的例外。
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
這些是循環語句
而(表達式)語句
do語句而(表達);
爲(表達式[選擇];表達[選擇];表達[選擇])語句
爲(聲明表達式[選擇];表達[選擇])語句
while循環是設計用於評估之前的控制表達式每次執行循環並且do循環被設計用於在每次執行之後評估。
for循環被設計爲更復雜的迭代語句。
6.8.5.3 for語句
爲(第-1;表達-2;表達-3)該語句
語句
表現爲如下: 表達expression- 2是每次執行循環體之前評估的控制表達式 。在每次執行循環體之後,表達式-3的表達式被評估爲空表達式。如果子句-1是一個聲明,則聲明的任何 標識符的範圍是聲明的剩餘部分和整個循環,包括其他兩個表達式;在控制 表達式的第一次評估之前,以 執行順序達到該值。如果子句-1是一個表達式,則在控制表達式的第一次評估之前,它將被評估爲void 表達式。
子句-1和表達式-3都可以省略。省略的 表達式-2被非零常量替換。
該規範允許表達式-2(循環的條件)被省略並由非零常量替代。這意味着for循環將繼續無限期地執行。
這對允許簡單的語法進行迭代而沒有結束很有用。
for(int i = 0;;i++) { //do stuff with i }
這是更簡單的編寫和理解比寫與申報外循環,然後遞增循環中的變量的同時(1)循環。
for循環規範繼而允許您省略子句-1,以便您可以在別處聲明或初始化變量,並且可以省略表達式-3,以便在完成每個表達式時不需要評估任何表達式循環。
for循環是一種特殊情況。 while循環和do循環是嚴格的,需要一個表達式,但for循環是一個靈活的迭代語句。
我不能給出一個明確的答案,但我的猜測是,因爲在for
循環的情況下,有三種不同的表達式,根據循環,你可能需要也可能不需要使用每個表達式。
在if
的情況下,如果沒有表達式,則沒有意義;它總是需要表現得好像表達是真的還是假的那樣,因此就相當於只有一個條款。在while
的情況下,將會有一個有意義的解釋while() { }
,這將是評估爲while (1) { }
(給你一個循環,你可以跳出break
),但我想忽略這個單一字符的好處不是值得麻煩。
但是,在for
循環的情況下,有三種不同的表達式,每種表達式都可能需要也可能不需要。例如,如果你想在每個循環中初始化和增加一些東西,但是會使用break
來跳出循環,你可以編寫for (i = 0; ; ++i)
,或者如果你只想測試和增量,因爲你的變量已經被初始化了,你可以寫for (; i > 0; --i)
。鑑於這些表達式中的每一個可能都不是必需的,具體取決於您的循環,因此讓您爲所有不使用的所有內容填充佔位符似乎有點麻煩;並且爲了一致性,而不是在其中一個佔位符中需要佔位符,它們都是可選的,並且如果省略,則該條件被認爲是恆定的非零值。
當然,有時候很容易在設計決策中讀到太多的意圖。有時,給定標準的原因很簡單,就是它是如何在第一個實現中實現的,而其他人都只是複製了它。有關示例,請參見Rob Pike's explanation爲何在Unix中隱藏以.
開頭的文件;這不是由於有意的設計決定,而僅僅是因爲有人在編寫ls
時採取了快捷方式,並且不希望每次都顯示.
和..
目錄條目。
因爲有人認爲這很方便嗎? – Pubby
@Pubby請你詳細說明一下嗎?你在問一個問題嗎? –
我會猜測爲什麼與C兼容的原因。 –