C語言目前有3套標準,分別是C89(ANSI C) / C90,C99,C11。
C89(ANSI C) / C90標準下的C語言就是主流大學C語言教科書裡教的的C語言。
C99標準比C89多了一些新的特性,其中包括可變長陣列(VLA)。
C99中,程式設計師宣告陣列時,陣列的維數可以由任一有效的整型表示式確定(包括只在執行時才能確定其值的表示式),這類陣列就叫做可變長陣列。
可變長陣列是在棧中分配空間的,函式返回時釋放空間。這與用alloca函式建立陣列一致,可以說是一種語法糖。
C99標準還包括一些其他特性,比如分散程式碼與宣告(所有的變數定義不必需在函式的一開始定義)、具有可變數目的引數的宏、for語句內的變數宣告、零長陣列、範圍case,複合賦值初始化符,冪等限定符等。
這些C99標準中的特性,已經被GCC(GNU Compiler Collection,GNU編譯套件)的C編譯器實現了。
更進一步的是,這些C99標準中的特性,有一部分在C++標準裡沒有但已經被GCC的C++編譯器實現了,其中就包括可變長陣列(VLA)。
當然也有些一部分C99特性在C++標準裡沒有也並未被GCC的C++編譯器實現,如合賦值初始化符,冪等限定符。
因此,如果我們使用GCC,那麼對於C/C++程式碼,以下程式碼段均合法。
C語言目前有3套標準,分別是C89(ANSI C) / C90,C99,C11。
C89(ANSI C) / C90標準下的C語言就是主流大學C語言教科書裡教的的C語言。
C99標準比C89多了一些新的特性,其中包括可變長陣列(VLA)。
C99中,程式設計師宣告陣列時,陣列的維數可以由任一有效的整型表示式確定(包括只在執行時才能確定其值的表示式),這類陣列就叫做可變長陣列。
可變長陣列是在棧中分配空間的,函式返回時釋放空間。這與用alloca函式建立陣列一致,可以說是一種語法糖。
C99標準還包括一些其他特性,比如分散程式碼與宣告(所有的變數定義不必需在函式的一開始定義)、具有可變數目的引數的宏、for語句內的變數宣告、零長陣列、範圍case,複合賦值初始化符,冪等限定符等。
這些C99標準中的特性,已經被GCC(GNU Compiler Collection,GNU編譯套件)的C編譯器實現了。
更進一步的是,這些C99標準中的特性,有一部分在C++標準裡沒有但已經被GCC的C++編譯器實現了,其中就包括可變長陣列(VLA)。
當然也有些一部分C99特性在C++標準裡沒有也並未被GCC的C++編譯器實現,如合賦值初始化符,冪等限定符。
因此,如果我們使用GCC,那麼對於C/C++程式碼,以下程式碼段均合法。