C語言的FOR循環的「起始值」變量聲明 - C標準允許哪些變量聲明?
在其C標準以下代碼編譯沒有錯誤 (C89,C99,C11)
據我所知,一些C編譯器將不接受上述版本和變量「我「必須在括號外聲明。像這樣:
int i;
for (i = 0; i < 10; ++i) {
DO SOMETHING...
}
C語言的FOR循環的「起始值」變量聲明 - C標準允許哪些變量聲明?
在其C標準以下代碼編譯沒有錯誤 (C89,C99,C11)
據我所知,一些C編譯器將不接受上述版本和變量「我「必須在括號外聲明。像這樣:
int i;
for (i = 0; i < 10; ++i) {
DO SOMETHING...
}
這是自c99以來允許的。所以c99和c11支持它。
在c89中,for
語句的第一個子句只能是一個表達式。在c99和c11中,它可以是表達式或聲明。只允許一個單獨的聲明(儘管這可以聲明幾個變量)。
C99是當第一次支持成爲標準的一部分時。
基本上,for
語句引入了一個額外的隱式塊。所有其他塊範圍規則保持不變。
您可以通過引入自己周圍的for
環附加塊範圍模擬預C99實現同樣的事情:
{
int i;
for (i = 0; i < 10; ++i)
{ ... }
}
{
int i; // i here is not the same as i up there
}
它在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);
哪個編譯您使用的? – haccks