3 回答

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

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
ISO / IEC 9899:1999 6.6 / 3(常量表達(dá)式)規(guī)定,不同的表達(dá)式不應(yīng)包含逗號(hào)運(yùn)算符(除非是未計(jì)算的子表達(dá)式的一部分),因此(10,20)
根據(jù)定義,它不是常量表達(dá)式。
基本原理必須是因?yàn)槎禾?hào)表達(dá)式的第一部分的值不是使用它只有它的副作用,并且常量表達(dá)式?jīng)]有副作用。

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
編譯器不將其視為常量表達(dá)式,因?yàn)樽兞渴亲詣?dòng)的。允許在運(yùn)行時(shí)進(jìn)行評(píng)估并獲取值。嘗試使變量成為靜態(tài),您將看到相同的錯(cuò)誤消息,因?yàn)榫幾g器將需要一個(gè)常量表達(dá)式。
添加回答
舉報(bào)