web-dev-qa-db-ja.com

C ++の関数宣言の後にセミコロン( ';')は必要ありませんか?

私は最近、中間プログラミングテストを受けましたが、間違った質問の1つは次のとおりでした。

関数宣言の後にセミコロン( ';')は必要ありません。

正しいか間違っているか。

「false」を選択しました(そして、気が狂っているような気がして間違っている場合は修正してください)、関数declarationはあなたのものです定義の前(コードの先頭)に書き込むと、コンパイラーは関数呼び出しを呼び出す前にそれを認識し、関数definitionが構成されます全体としての機能。

つまり、

宣言:

int func();

定義:

int func() {
  return 1;
}

これに対する答えは偽ではありませんか?

174
Logan

1つのステップで関数を宣言および定義する場合、つまり、宣言しているポイントに関数定義を含める場合があります。 技術的に trueが正しいと思います。しかし、質問はあなたがしたように私がそれに答えたであろうような方法で言い表されます。

162
jwismar

「定義は宣言でもある」ことに加えて、以下は正当なC++です。

_int f(), g();
_

これは、2つの関数fgを宣言します。両方とも引数なしで、戻り値の型がintですが、fの定義はすぐには続きません。 )セミコロン。同様に、これは合法です:

_int f(), i = 42;
_

しかし、これらの場合、セミコロンを完全に省略することは実際に許可されていないため、セミコロンなしの宣言の例としてどちらかを使用した場合、多少驚くでしょう。実際、以下は違法です。

_void *p, f() {}
_

(単なる)関数宣言以外の関数definitionは、同じtype-specifierに対する他の宣言または定義と組み合わせることはできません。 (これが正当であれば、_void *p_とvoid f() {}の両方を定義します。)

いずれにせよ、これは中間的なプログラミングテストに含めるべきではない「落とし穴」タイプの質問のようです。

(ああ、ところで、実際にはint f(), i = 42;のようなコードを書かないでください。)

148
Arne Vogel

他の回答とコメントは、これが恐ろしく、誤解を招く、不適切に記述された質問である多くの方法のいくつかを呼び出します。しかし、まだ誰も特定していない別の問題があります。質問は:

関数宣言の後にセミコロン( ';')は必要ありません。正しいか間違っているか。

OK、関数宣言を見てみましょう。

_int func();       /* */
/*           ^       */
/*           |       */
/* That whitespace is "after the function declaration". */
_

これが宣言です。宣言はint func()ではなく、-後に続く a _;_です。宣言はint func();であり、その後に空白が続きます。

だから、質問は:セミコロンが必要ですか宣言の後?もちろん違います。 宣言にはすでにセミコロンがあり、それを終了しました。宣言の後のセミコロンは無意味です。対照的に、int func(); ;は、関数宣言の後のセミコロンになります

質問はほぼ間違いなく意図されていました「trueまたはfalse:関数宣言の最後のトークンは常にセミコロンです」しかし、それは彼らが書いた質問ではありません。クイズの著者は問題について明確に考えていませんでした。

私のアドバイスは、プログラミング言語のクイズを完全に避けることです。彼らはかなりひどいです。


面白い事実ですが、私たちはこのテーマについて話します。 C#では、これらはすべて合法です:

_class C {}
class D {};
struct E {}
struct F {};
_

C#では、クラスまたは構造体の宣言は、ユーザーの裁量でセミコロンで終わる場合とそうでない場合があります。この奇妙な小さな機能は、型宣言が無意味なセミコロンで終わることを指先で持っているC#に来るC/C++プログラマーのために追加されました。設計チームは、この習慣を持つことで彼らを罰したくありませんでした。 :-)

83
Eric Lippert

次のような関数も宣言できます。

int func(){
    return 1;
}

ステートメントは非常にあいまいです。正しい答えは次のとおりです。関数の宣言方法によって異なります。

とにかく、私もfalseを選択していたので、誰かに質問を報告してください。

25
Luca Corsini

関数宣言の後にセミコロン( ';')は必要ありません。

正しいか間違っているか。

True。宣言後にセミコロンは必要ありません。また、任意の定義の後。声明の後でもありません。

セクション7 [dcl.dcl]の構文で指定されているように、多くの種類の宣言はセミコロンで終了する必要があります。しかし、その後に2つ目を書く必要はありません。

20

これは、関数を宣言するか定義するかによって異なります。関数を宣言する場合は、セミコロン(;)、および関数を定義する場合、セミコロンは必要ありません。

宣言は次のとおりです。

int add(int, int);

そして、定義は次のようなものです。

int add(int a, int b)
{
    // ...
}
6
Rocx En Ruff

あなたが取った質問が「直後」と言っていないのは残念です。たとえば、次のように書くことができます。

int func()  /* My function */ ;

または私は書くことができます:

int func()
int a = 42;

最初の場合、セミコロンは直後宣言ではありませんが、それで問題ありません。

2番目のケースでは、宣言の「後」にセミコロンがありますが、直後にはありません。

Eric Lippertは 彼の答え で正しい考えを持っていると思います。

「英語の文の終わりの後に期間があるべきですか?」と言っているようなものです。ほぼ間違いなく、文にはすでに末尾にピリオドがあります(そうでなければ文ではありません)。したがって、ピリオドはありませんafter the the ..

6
Nick Gammon

質問は非常に曖昧であり、あなたの答えは技術的に正しいと述べて、私は他のほとんどすべての答えに同意しますが、別の視点を与えてください:

これは私がいつもそれらを呼んだ方法です:

void func();  // The function prototype

...

void func()
{
    // The function definition
}

質問はこの用語を念頭に置いて構成されていると思います。

定義と宣言はどちらも私の目には同じ概念です。 「x = yを定義します」==「x = yを宣言します」。

しかし、もちろん、関数のプロトタイプ(上)と実際の関数の定義には大きな違いがあります。

6
Opifex

;はプロトタイプにのみ使用できます。

4
M7off

ちょっと難しい質問ですが、彼らはWord declarationを使用しました。

int example();

したがって、この場合は本当です。

彼らがWord implementationを使用していた場合、それは間違っていました。

4
dark_3nergy

セミコロン(;)は、このセミコロン(;)の後に新しいステートメントが開始することをコンパイラーに伝えるために使用されます。

したがって、セミコロン(;)は関数宣言の際にのみ必要だと思います。だから、私によると、答えは本当だろう。

2
Jatinder

関数がmain()の前に定義されるの場合:

  • セミコロンは不要関数は既に定義されているため

関数がmain()の後に定義の場合:

  • セミコロンが必要は、その関数をプロトタイプ化し、関数が終了することをコンパイラーに伝えるためです。
2
shiv shah