簡體   English   中英

在哪個版本的C中,括號內的塊用於返回有效值?

[英]In what versions of C is a block inside parenthesis used to return a value valid?

如果我做:

int j = ({int x = 7; x+3;});

在i686-apple-darwin10-gcc-4.2.1(GCC)4.2.1(Apple Inc.內部版本5646)中,gcc可以正常編譯。 所討論的塊({int x = 7; x+3;})返回最后一條語句的值作為該塊的值。 如果刪除括號,則不會編譯。 我可以期望它在大多數C編譯器中都能正常工作嗎?

此外,此構造的名稱是什么? 我在搜索時遇到了很多麻煩,因為搜索引擎無法索引(){}而C是一個糟糕的搜索詞。 我也無法在我的任何書中找到關於它的任何東西,可能是因為我不知道要尋找什么。

這是一個GCC擴展名

括號中的復合語句可能會在GNU C中作為表達式出現。這使您可以在表達式中使用循環,開關和局部變量。

回想一下,復合語句是用括號括起來的一系列語句; 在此構造中,括號括在括號中。 例如:

  ({ int y = foo (); int z; if (y > 0) z = y; else z = - y; z; }) 

對於foo ()的絕對值,是一個有效的表達式(盡管比必需的復雜一些foo ()

復合語句中的最后一件事應該是一個表達式,后跟一個分號。 該子表達式的值用作整個構造的值。 (如果最后在花括號內使用其他類型的語句,則該構造的類型為void ,因此實際上沒有任何值。)...

您可以期望它可以在大多數GCC版本中使用。

您可以期望它幾乎在其他任何地方都無法正常工作-這是GCC擴展。

GCC手冊中描述此功能的部分標題為“表達式中的聲明和聲明”:

括號中的復合語句可能在GNU C中作為表達式出現。

后來它說:

在語句表達式內的語句內創建的任何臨時對象都將在語句末尾銷毀。 這使得宏內部的語句表達式與函數調用略有不同。

因此,“語句表達式”似乎是文檔中使用的名稱。

如果刪除括號,則不會編譯。

如果沒有括號,則編譯器會將其視為聚合初始化塊,並且在看到int關鍵字時將失敗。 初始化程序塊中不能包含關鍵字。

6.7.8初始化

11標量的初始值設定項應為單個表達式,可以選擇用大括號括起來。 對象的初始值是表達式的初始值(轉換后); 采用與簡單賦值相同的類型約束和轉換,將標量的類型作為其聲明類型的非限定版本。

6.2.5類型

21算術類型和指針類型統稱為標量類型。 數組和結構類型統稱為集合類型。


我可以期望它在大多數C編譯器中都能正常工作嗎?

否。看起來像是非標准的GNU擴展。

此外,此構造的名稱是什么?

我想知道是否有。 實際上,這類似於宏通常執行的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM