C++ で関数宣言の後にセミコロン ('') は必要ではないですか?

関数の宣言と定義を 1 つのステップで行う場合、つまり、関数を宣言する時点で関数定義を含める場合があります。 技術的に true が正しいと思います。しかし、その質問は、私があなたのように答えたであろうような言い回しになっています.


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

int f(), g();

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

int f(), i = 42;

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

void *p, f() {}

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

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

(ちなみに、int f(), i = 42; のようなコードは実際には書かないでください。 .)


他の回答とコメントは、これが恐ろしく、誤解を招き、ひどく書かれた質問であるという多くの方法のいくつかを呼び出します.しかし、他の誰もまだ特定していない別の問題があります。問題は:

では、関数宣言を見てみましょう:

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

そのすべてが宣言です .宣言は int func() ではありません 続いて ; .宣言は int func(); です その後に空白が続きます。

問題は、宣言の後にセミコロンが必要かどうかです。 ?もちろん違います。 宣言には、宣言を終了するセミコロンが既に含まれています。 宣言の後のセミコロンは無意味です。対照的に、int func(); ; 関数宣言の後はセミコロンになります .

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

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

おもしろい事実です。 C# では、これらはすべて合法です:

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

C# では、クラスまたは構造体の宣言をセミコロンで終了するかどうかは、ユーザーの判断で決めることができます。この奇妙な小さな機能は、型宣言が意味のないセミコロンで終わることをすぐに理解できる C# を使用する C/C++ プログラマーのために追加されました。デザイン チームは、この習慣を持っていることで彼らを罰したくありませんでした。 :-)