在 C89 A.1.2.2 宣告中
直接宣告符 [ 常量運算式 ]
在 C99 A.2.2 中宣告
直接宣告符 [ type-qualifier-list_opt assignment-expression_opt ]
我理解assignment-expression_opt為var = 1;。但是陣列沒有宣告為int arr[i = 0];. 為什么 C99 使用術語“賦值運算式”而不是“常量運算式”,這是什么意思?
uj5u.com熱心網友回復:
在 C89 中,不支持可變長度陣列。這意味著陣列大小必須在編譯時固定。
從 C99 開始,宣告和陳述句可以混合在一個塊中,因此現在允許必須執行的完整運算式作為初始值設定項。這也是允許創建可變長度陣列的原因。
所以像這樣的宣告int arr[i=0];是有效的語法,盡管它是無效的,因為它創建了一個大小為 0 的陣列。它 int arr[i=2];是有效的,并將創建arr為一個int大小為 2 的陣列,并且它設定i為 2。
uj5u.com熱心網友回復:
這是因為 C99 支持 VLA 并且介于兩者之間的任何內容都[]可能是幾乎任何運算式。
至于為什么它專門說賦值運算式:
在 C 中描述運算式的語法和運算子優先級的方式是讓每個運算子組的語法指向比其自身具有更高優先級的運算子組。例如查看賦值運算式的語法:
賦值運算式:
條件運算式
它指向條件運算子,該條件?:運算子將是下一個優先級高于賦值運算子的運算子組。
對于所有優先級最低的逗號運算子,語法實際上是:
運算式:
賦值運算式
運算式,賦值運算式
也就是說,C 中運算式的語法。現在出于某種原因,C99 顯然不想在[]. 我不知道為什么 - 也許它會使合格/靜態陣列引數宣告器太奇怪。因此,他們沒有在直接宣告符語法中使用運算式,而是選擇了逗號運算子上方的下一個運算子組,即賦值運算子。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/410329.html
標籤:
上一篇:為什么這兩個執行緒不同步運行?
下一篇:查找C程式中的漏洞
