80

この奇妙な C++ プログラムに出くわしました。

#include <iostream>
using namespace std;
int main()
{
  int a = ({int x; cin >> x; x;});
  cout << a;
}

誰が何が起こっているのか説明できますか? この構成は何と呼ばれますか?

4

4 に答える 4

71

ユーザー入力値を割り当てて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

于 2011-06-10T11:02:12.937 に答える
56

これは GCC 拡張機能です。-pedanticこのようなものを取り除きたい場合 (そして本当にそうしたい場合)は、フラグを使用してコードをコンパイルします。

于 2011-06-10T11:07:00.270 に答える
18

インラインスコープを作成し、そのx中で宣言し、標準入力から読み取り、ステートメント全体が最終的に に評価されx、 に割り当てられaます。

コンマ演算子も同様に機能しますが、別のスコープは必要ありません。例えば:

int x;
int a = (cin >> x, x);

同じことをします。コンマで接続されたすべてのステートメントが順番に実行され、式全体の結果が右端のオペランドの値に設定されます。

于 2011-06-10T11:01:42.733 に答える
13

これが標準の C++ であるとは思えません。おそらく、内部スコープが値を評価できるようにするコンパイラ固有の拡張機能です。

于 2011-06-10T11:02:31.437 に答える