この奇妙な 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++ であるとは思えません。おそらく、内部スコープが値を評価できるようにするコンパイラ固有の拡張機能です。