Kos*_*tsu 76 c++ syntax language-extension gcc-extensions
我遇到了这个奇怪的C++程序.
#include <iostream>
using namespace std;
int main()
{
int a = ({int x; cin >> x; x;});
cout << a;
}
Run Code Online (Sandbox Code Playgroud)
谁能解释一下发生了什么?这个结构叫做什么?
Alo*_*ave 65
它将用户输入值分配a并打印出来.它是通过使用a来完成的Statement Expression.
语句表达式是gnu gcc编译器扩展不受C/C++标准支持.因此,任何使用语句表达式的代码都是非标准的,不可移植的.
IBM IBM XL C/C++ v7.0也支持Statement Expressions,它的文档适当地解释了它们:
声明表达:
复合语句是由大括号括起来的一系列语句.在GNU C中,括号内的复合语句可能在所谓的a中表示为表达式
Statement expression.
.--------------.
V |
>>-(--{----statement--;-+--}--)--------------------------------><
Run Code Online (Sandbox Code Playgroud)
语句表达式的值是要在整个构造中出现的最后一个简单表达式的值.如果最后一个语句不是表达式,则构造的类型为void且没有值.
通过选择GCC中sandard始终编译代码,使用其中的一个选项-ansi,-std=c90或-std=iso9899:1990,-std=c++03,-std=c++0x; 要获得标准所需的所有诊断,您还应指定-pedantic(或者-pedantic-errors如果您希望它们是错误而不是警告)
小智 54
这是GCC扩展.编译的代码-pedantic,如果你想摆脱这样的东西(你真的国旗做想).
Bla*_*iev 18
它创建一个内联作用域,x在其中声明,从标准输入中读取它,并将整个语句最终求值为x,分配给它a.
逗号运算符的工作方式类似,但它不需要单独的范围.例如:
int x;
int a = (cin >> x, x);
Run Code Online (Sandbox Code Playgroud)
也会这样做.与逗号连接的所有语句将按顺序执行,整个表达式的结果将设置为最右侧操作数的值.
Oli*_*rth 13
我不相信这是标准的C++.它可能是特定于编译器的扩展,允许内部作用域计算为值.
| 归档时间: |
|
| 查看次数: |
3815 次 |
| 最近记录: |