我有一个最简单的c ++声明,声明一个变量“ a”:
int a = ({ int b = 10; b; });
正如最近的gcc和clang所说,这是一条有效的语句,实际上声明了变量a
的值为10。
问题是:这是什么?我知道各种类型的表达式。我知道各种类型的语句。但是我在c ++ 14标准中找不到任何提及“将块语句作为表达式返回最新的内部求值表达式”之类的东西。
有人可以指出标准行完全正确的标准行吗?
答案 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。