C 言語の練習中に式に直面し、次のように単純化します。
int a=({10;});
gcc コンパイラを通過するため、これは正当な式です。この部分に注目してください: ({10;})
. 誰かがそれを説明できますか?詳細なほど良い。ありがとう!
C 言語の練習中に式に直面し、次のように単純化します。
int a=({10;});
gcc コンパイラを通過するため、これは正当な式です。この部分に注目してください: ({10;})
. 誰かがそれを説明できますか?詳細なほど良い。ありがとう!
これはステートメント式です。これはgcc 拡張であり、ドキュメント6.1 Statements and Declarations in Expressionsによると:
複合ステートメントの最後の部分は、式の後にセミコロンを付ける必要があります。この部分式の値は、構造全体の値として機能します。
したがって、このコードの場合:
int a=({10;});
これらの規則に従って、値は10
に割り当てられa
ます。
この拡張機能は、Linux カーネルで使用される多くの gcc 拡張機能の1 つです。ただし、リンクされた記事はステートメント式を実際にはカバーしていませんが、このカーネル初心者向け FAQ エントリでは、Linux カーネルでステートメント式を使用する理由のいくつかを説明しています。
gccドキュメントにあるように、 -pedanticオプションを指定してコンパイルすると、 gcc 拡張機能を使用しているときに警告が表示されます。
これは標準 C ではなく、ステートメント式と呼ばれる GCC の拡張です。括弧で囲まれた複合ステートメントは、式として表示される場合があります。
複合ステートメントの最後の部分は、式の後にセミコロンを付ける必要があります。この部分式の値は、構造全体の値として機能します。
あなたの例に戻ります:
int a=({10;});
{10;}
は複合ステートメント式として機能するためa
、値は10
です。