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