亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C逗號運算符

C逗號運算符

為什么在逗號運算符(例如下面的示例)中指定的表達式不被視為常量表達式?例如,int a = (10,20) ;當在全局范圍內給出時產生錯誤“初始化器不是常量”,盡管由逗號運算符分隔的兩個表達式都是常量(常量表達式)。為什么整個表達式不被視為常量表達式?為了澄清我已經閱讀了','運算符在C中做了什么?和C逗號運算符的使用。他們沒有涉及逗號運算符的這個方面。
查看完整描述

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不希望交叉編譯器的制造商承擔為每個可能的目標承載執行環境的負擔。


查看完整回答
反對 回復 2019-09-03
?
白衣染霜花

TA貢獻1796條經驗 獲得超10個贊

ISO / IEC 9899:1999 6.6 / 3(常量表達式)規定,不同的表達式不應包含逗號運算符(除非是未計算的子表達式的一部分),因此(10,20)根據定義,它不是常量表達式。

基本原理必須是因為逗號表達式的第一部分的值不是使用它只有它的副作用,并且常量表達式沒有副作用。


查看完整回答
反對 回復 2019-09-03
?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

編譯器不將其視為常量表達式,因為變量是自動的。允許在運行時進行評估并獲取值。嘗試使變量成為靜態,您將看到相同的錯誤消息,因為編譯器將需要一個常量表達式。


查看完整回答
反對 回復 2019-09-03
  • 3 回答
  • 0 關注
  • 824 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號