我遇到了这个奇怪的 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;
}
谁能解释发生了什么?这个结构叫什么?
它将用户输入值分配给a
并打印出来。它是通过使用Statement Expression
.
语句表达式是gnu gcc 编译器扩展,不受 C/C++ 标准支持。因此,任何使用语句表达式的代码都不符合标准且不可移植。
IBM XL C/C++ v7.0 也支持语句表达式,其文档对它们进行了恰当的解释:
语句表达式:
复合语句是由大括号括起来的语句序列。在 GNU C 中,括号内的复合语句可能以表达式的形式出现在所谓的 a
Statement expression
中。
.--------------.
V |
>>-(--{----statement--;-+--}--)--------------------------------><
语句表达式的值是出现在整个构造中的最后一个简单表达式的值。如果最后一条语句不是表达式,则构造是 void 类型并且没有值。
始终通过选择 GCC 中的标准来编译您的代码:使用选项之一-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++。它可能是一个特定于编译器的扩展,允许内部范围评估为一个值。