式が予想されるブレースアラウンドブロックを置くこのC ++構文は何ですか?

StackOverflow https://stackoverflow.com/questions/6305396

質問

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

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

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

役に立ちましたか?

解決

ユーザーの入力値をに割り当てます a そしてそれを印刷します。 aを使用して行われます Statement Expression.

ステートメント式はです GNU GCCコンパイラ拡張機能 C/C ++標準ではサポートされていません。したがって、ステートメント式を使用するコードは、非標準的な適合性と非携帯性です。

IBM IBM XL C/C ++ V7.0は、ステートメントの表現もサポートしており、それはそれらを適切に説明しています。

ステートメント表現:

複合ステートメントは、ブレースに囲まれた一連のステートメントです。 GNU Cでは、括弧内の複合ステートメントが、と呼ばれるものの式として表示される場合があります Statement expression.

         .--------------.
         V              |
>>-(--{----statement--;-+--}--)--------------------------------><

ステートメント式の値は、構成全体に表示される最後の単純な式の値です。最後のステートメントが式ではない場合、コンストラクトはタイプのvoidであり、値はありません。

GCCでサンダードを選択してコードを常にコンパイルし、オプションの1つを使用してください -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 ++であるとは思わない。これはおそらく、内部スコープが値に評価できるようにするコンパイラ固有の拡張機能です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top