ホームページ >バックエンド開発 >C++ >`widget w(gadget(), doodad());` は C の変数宣言ですか、それとも関数宣言ですか?

`widget w(gadget(), doodad());` は C の変数宣言ですか、それとも関数宣言ですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-19 08:43:03744ブラウズ

Is `widget w(gadget(), doodad());` a Variable Declaration or a Function Declaration in C  ?

C の最も厄介な解析: 関数宣言の謎を明らかにする

ウィジェット w(); の構文を理解しながら

widget w( gadget(), doodad() ); // pitfall: not a variable declaration

この謎を解明するには、 C の減衰規則を詳しく調べることが重要です。関数宣言内では、配列型の引数は最初の要素を指すポインターに縮退しますが、関数型の引数は関数ポインターに変換されます。

この原則を適用すると、前述のコードは次のシグネチャに変換されます。

widget w( gadget(*)(), doodad(*)() );

これは、2 つの引数を受け入れる関数を示します。1 つは引数をとらず、ガジェット タイプを返す関数へのポインタ、もう 1 つは引数を 0 も取らず、doodad タイプを返す関数へのポインタです。関数自体はウィジェットを返します。

複雑さはそれだけではありません。この複雑な例を考えてみましょう:

widget w(gadget(x));

x が変数である場合、これはどのようにして関数宣言になるのでしょうか?

C では、変数を宣言するときに追加の括弧を含めることができます。ガジェットx;およびガジェット (x);。これは関数の引数にも適用され、上記のコードは、ガジェット型の x という名前の引数を 1 つ取り、ウィジェットを返す関数宣言として解釈できます。

以上が`widget w(gadget(), doodad());` は C の変数宣言ですか、それとも関数宣言ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。