在C ++中评估块语句的结果

时间:2018-11-24 11:06:21

标签: c++ c++14

我有一个最简单的c ++声明,声明一个变量“ a”:

int a = ({ int b = 10; b; });

正如最近的gcc和clang所说,这是一条有效的语句,实际上声明了变量a的值为10。

问题是:这是什么?我知道各种类型的表达式。我知道各种类型的语句。但是我在c ++ 14标准中找不到任何提及“将块语句作为表达式返回最新的内部求值表达式”之类的东西。

有人可以指出标准行完全正确的标准行吗?

1 个答案:

答案 0 :(得分:2)

  

问题是:这是什么?

这是对ISO标准C的GNU扩展,该扩展也可用于C ++,但同样不是ISO C ++的一部分。

引用GCC Manual: Chapter 6 - Extensions to the C Language Family

  

...

     

这些扩展在C和Objective-C中可用。它们中的大多数也可以在C ++中获得。 ...

     
      
  • Statement Exprs:将语句和声明放在表达式中。
  •   

GCC Manual: Section 6.1 - Statements and Declarations in Expressions中详细解释了后者:

  

括号中的复合语句可能在GNU C中作为表达式出现。这使您可以在表达式中使用循环,开关和局部变量。

     

回想一下,复合语句是用括号括起来的一系列语句;在此构造中,括号括在括号中。例如:

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

对于foo ()的绝对值是有效的表达式(尽管比必需的复杂一些)。

     

...

对于Clang,Clang Language Extensions描述Clang旨在支持许多GCC扩展:[ emhpasis 我的]:

  

本文档介绍了Clang提供的语言扩展。除了此处列出的语言扩展之外, Clang旨在支持各种GCC扩展。有关这些扩展名的更多信息,请参见GCC manual