C の最も厄介な解析を再訪
C の悪名高い「最も厄介な解析」現象は、一見無害に見えるステートメントが解釈できる場合に発生します関数宣言または変数宣言として。これにより、予期しない動作やデバッグが難しいエラーが発生する可能性があります。
典型的な例の 1 つは次のコード スニペットです。
widget w( gadget(), doodad() );
一見すると、これは変数宣言のように見えます。括弧で囲まれた初期化子を持つ w という名前のウィジェット。しかし、詳しく調べてみると、gadget() と doodad() は関数呼び出しであり、このステートメントは関数宣言であることがわかります。
配列型の関数引数は最初の要素へのポインターに分解されるため、あいまいさが生じます。一方、関数型の関数引数は関数ポインターに分解されます。これは、上記の関数のシグネチャが実際には次のとおりであることを意味します。
widget w( gadget(*)(), doodad(*)() );
言い換えると、2 つの関数ポインタを引数として受け取り、ウィジェットを返します。
変数を使用すると、さらに複雑なケースが発生します。
widget w(gadget(x));
x は変数であるため、これを関数宣言として解釈することは不可能と思われます。ただし、C では変数宣言に括弧を追加できます。したがって、両方のガジェット x;およびガジェット (x);同じ変数 x を宣言します。
したがって、上記のコードは、x という名前のガジェット型の単一の引数を受け取り、ウィジェットを返す関数宣言として解析できます。これは、これらの微妙な落とし穴を回避するには、C 構文の複雑さを理解することが重要であることを示しています。
以上がC の「最も厄介な解析」が変数宣言を関数宣言と誤って解釈するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。