3 回答

TA貢獻2019條經驗 獲得超9個贊
節6.6/3,“常量表達式”,在ISO C99標準的是你需要的部分。它指出:
常量表達式不應包含賦值,遞增,遞減,函數調用或逗號運算符,除非它們包含在未計算的子表達式中。
在ISO的C99基本原理文檔中,有一個小片段:
整數常量表達式必須只涉及在轉換時可知的數字,以及沒有副作用的運算符。
而且,因為有一個在使用逗號操作毫無意義可言,如果你不依賴的副作用,它是在一個常量表達式沒用。
通過這個,我的意思是兩個代碼段之間絕對沒有區別:
while (10, 1) { ... }
while (1) { ... }
因為10實際上并沒有做任何事情。事實上,
10;
這是一個完全有效的,但不是很有用的C語句,大多數人都不理解,直到他們更好地了解語言。
然而,就是這兩個語句之間的區別:
while ( 10, 1) { ... }
while (x=10, 1) { ... }
后者使用逗號運算符會產生副作用,即將變量設置x為10。
至于為什么他們不喜歡常量表達式中的副作用,常量表達式的全部意義在于它們可以在編譯時進行求值而無需執行環境 - ISO對轉換(編譯時)和執行進行區分(運行時)環境。
關于為什么ISO決定要求編譯器提供執行環境信息(除了包含在頭文件中的東西之外)的原因的線索limits.h可以在理論文檔中稍后找到:
然而,雖然實現當然允許在轉換和執行環境中產生完全相同的結果,但要求這被認為是許多交叉編譯器的不可容忍的負擔。
換句話說,ISO不希望交叉編譯器的制造商承擔為每個可能的目標承載執行環境的負擔。

TA貢獻1796條經驗 獲得超10個贊
ISO / IEC 9899:1999 6.6 / 3(常量表達式)規定,不同的表達式不應包含逗號運算符(除非是未計算的子表達式的一部分),因此(10,20)
根據定義,它不是常量表達式。
基本原理必須是因為逗號表達式的第一部分的值不是使用它只有它的副作用,并且常量表達式沒有副作用。

TA貢獻1810條經驗 獲得超4個贊
編譯器不將其視為常量表達式,因為變量是自動的。允許在運行時進行評估并獲取值。嘗試使變量成為靜態,您將看到相同的錯誤消息,因為編譯器將需要一個常量表達式。
添加回答
舉報