ホームページ  >  記事  >  バックエンド開発  >  `widget w(gadget(), doodad());` は C の変数宣言ですか?

`widget w(gadget(), doodad());` は C の変数宣言ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-19 07:53:02866ブラウズ

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

C の最も厄介な解析が解決されました

問題は次のようなコードで発生します。

widget w(gadget(), doodad());  // Pitfall: Not a Variable Declaration

Oneこのコードは、ウィジェット型の w という名前の変数を宣言していると想定する場合があります。しかし、これは当てはまりません。

C では、配列型の引数は最初の要素へのポインターに分解され、関数型の引数は関数ポインターに分解されます。これは、宣言されている関数のシグネチャが次のとおりであることを意味します。

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

この関数は 2 つの引数を取ります。1 つは引数をとらずガジェットを返す関数へのポインタで、もう 1 つは関数へのポインタです。引数を取らずに doodad を返します。関数自体はウィジェットを返します。

次のように関数の引数に余分な括弧が追加されると、さらに混乱するケースが発生します。

widget w(gadget(x));

これは、x of という名前の変数を宣言する必要があるように見えます。タイプ ガジェットですが、実際には、タイプ ガジェットの x という名前の最初の引数を受け取り、ウィジェットを返す関数を宣言しています。

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

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