2013-07-07 44 views

回答

7

這是自c99以來允許的。所以c99和c11支持它。

在c89中,for語句的第一個子句只能是一個表達式。在c99和c11中,它可以是表達式或聲明。只允許一個單獨的聲明(儘管這可以聲明幾個變量)。

4

C99是當第一次支持成爲標準的一部分時。

基本上,for語句引入了一個額外的隱式塊。所有其他塊範圍規則保持不變。

您可以通過引入自己周圍的for環附加塊範圍模擬預C99實現同樣的事情:

{ 
    int i; 
    for (i = 0; i < 10; ++i) 
    { ... } 
} 
{ 
    int i; // i here is not the same as i up there 
} 
7

它在C99首次推出。從C99 Rational V5.10§6.8.5.3的報價爲聲明

C99的新功能:這是常見的for循環涉及其在循環的開始初始化,從來沒有使用一個或多個反變量循環後再次。在C89中,有必要在封閉塊的開始處聲明這些變量,並隨後有意外重複使用它們用於其他目的。現在允許將這些變量聲明爲forstatement本身的一部分。這樣的循環變量位於新的範圍內,因此它不會影響其他具有相同名稱的變量,並在循環結束時被銷燬,這可能會導致優化。

爲了簡化語法,每個循環都被限制爲一個聲明(儘管這可以聲明多個變量),並且這些聲明必須具有自動寄存器類。

例子:

int i = 42; 15 
for (int i = 5, j = 15; i < 10; i++, j--) 
printf("Loop %d %d\n", i, j); 
printf("I = %d\n", i); // there is no j in scope 

將輸出:

Loop 5 15 20 
Loop 6 14 
Loop 7 13 
Loop 8 12 
Loop 9 11 
I = 42 25 

注意語法允許像循環:

for (struct s *p = list, **q; p != NULL; p = *q) 
q = &(p->next);