式が予想されるブレースアラウンドブロックを置くこのC ++構文は何ですか?
-
26-10-2019 - |
質問
この奇妙な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 ++であるとは思わない。これはおそらく、内部スコープが値に評価できるようにするコンパイラ固有の拡張機能です。