什么是这个C + +的语法,把一个括号包围的块放在一个expression式的位置?
我遇到了这个奇怪的C ++程序。
#include <iostream> using namespace std; int main() { int a = ({int x; cin >> x; x;}); cout << a; }
任何人都可以解释发生了什么事? 这个结构叫做什么?
它将用户input值分配给a
并打印出来。 它是通过使用Statement Expression
。
语句expression式是gnu gcc编译器扩展不被C / C ++标准支持。 因此,任何使用语句expression的代码都是非标准的,不可移植的。
IBM IBM XL C / C ++ v7.0也支持Statement Expressions和它的文档恰当地解释它们:
声明expression式:
复合语句是由大括号括起来的一系列语句。 在GNU C中,括号内的复合语句可能会作为一个expression式出现在所谓的
Statement expression
。
.--------------. V | >>-(--{----statement--;-+--}--)--------------------------------><
语句expression式的值是在整个结构中出现的最后一个简单expression式的值。 如果最后一个语句不是一个expression式,那么这个结构的types是void,并且没有值。
总是通过在GCC中select一个标准来编译你的代码,使用选项-ansi
, -std=c90
或-std=iso9899:1990
, -std=c++03
, -std=c++0x
; 要获得标准所需的所有诊断,还应该指定-pedantic
(或-pedantic-errors
如果您希望它们是错误而不是警告)
这是一个GCC扩展。 如果你想摆脱像这样的东西(你真的想这样做 ),用-pedantic
标志编译你的代码。
它创build一个内联作用域,在其中声明x
,从标准input中读取它,整个语句最终评估为x
,它被分配给a
。
逗号运算符类似地工作,虽然它不需要单独的作用域。 例如:
int x; int a = (cin >> x, x);
会做同样的事情。 所有与逗号连接的语句将被顺序执行,整个expression式的结果将被设置为最右边的操作数的值。
我不相信这是标准的C ++。 这可能是一个特定于编译器的扩展,它允许内部作用域评估为一个值。