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

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

ANSI C中的parens表達式包含復合語句(塊)嗎?

ANSI C中的parens表達式包含復合語句(塊)嗎?

C
海綿寶寶撒 2019-07-25 09:44:11
ANSI C中的parens表達式包含復合語句(塊)嗎?瀏覽Linux內核源代碼時,我發現了一段代碼,其中括號括起來的語句塊被視為表達式la lisp(或ML),即表達式,其值是最后一個語句的值。例如:int a = ({     int i;     int t = 1;     for (i = 2; i<5; i++) {         t*=i;     }     t;});我一直在研究ANSI C語法,試圖弄清楚這段代碼如何適合解析樹,但我還沒有成功。那么,有沒有人知道這種行為是由標準規定還是只是GCC的特殊性?更新:我已嘗試使用標志-pedantic,編譯器現在給我一個警告:warning: ISO C forbids braced-groups within expressions
查看完整描述

2 回答

?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

它被稱為“表達式中的支撐組”。

ANSI / ISO C和C ++都不允許它,但gcc支持它。


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

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

這是無效的C它是一個gcc名為語句表達式的擴展,你可以在這里找到完整的C擴展列表。這實際上是Linux內核中使用許多gcc擴展之一,似乎clang也支持這一點,盡管它沒有在文檔中明確命名。

當你觀察到最后一個表達式作為表達式的值時,文檔說(強調我的):

復合語句中最后一件事應該是一個后跟分號的表達式; 此子表達式的值用作整個構造的值。(如果你在大括號中最后使用了一些其他類型的語句,那么構造的類型為void,因此實際上沒有值。)

其中一個主要好處是制作安全的宏,避免多重評估帶有副作用的參數。給出的示例使用此不安全的宏:

#define max(a,b) ((a) > (b) ? (a) : (b))

可以使用語句表達式重寫其中一個ab兩個并重寫以消除此問題,如下所示:

#define maxint(a,b) \   ({int _a = (a), _b = (b); _a > _b ? _a : _b; })

注意,需要明確使用int哪個可以修復使用另一個gcc擴展名Typeof

#define max(a,b) \   ({ typeof (a) _a = (a), _b = (b); _a > _b ? _a : _b; })

請注意,clang也支持typeof。


查看完整回答
反對 回復 2019-07-25
  • 2 回答
  • 0 關注
  • 514 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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