69


12

おそらくばかげた質問なのか、前もって謝罪しますが、Cクラスでは、なぜ閉じ括弧の後にセミコロンがあるのでしょうか。 私は定期的にそれを忘れてコンパイラエラーを起こし、それゆえ時間を浪費しました。 私には多少余計なようですが、そうではないでしょう。 人々は本当に好きなことをしますか

クラスMyClass {
.
.
.
MyInstance;

*編集:*構造体とenumのC互換性の観点からそれを取得しますが、クラスはC言語の一部ではないので、私はそれが主に同様の宣言構造間の一貫性の維持があると思います。 私が探していたのは、何かを変更することができるというよりは、設計の論理的根拠に関連していました。

7 Answer


54


@MichaelHarenが提供するhttps://web.archive.org/web/20100906085102/http://cpptalk.net/confused-about-the-meaning-of-the-semicolon-vt11965.html[link]が提供しているようです。根本原因_。 セミコロン(他の人が指摘したように)はCから継承されます。 しかし、それはなぜCがそもそもそれを使ったのかを説明していません。 議論は例のこの宝石を含みます:

struct fred { int x; long y; };
main()
{
  return 0;
}

特に宣言されていない限り、Cの古いバージョンは関数からの暗黙のint戻り型を持っていました。 構造体定義の最後で ;`を省略すると、新しい型 `fred`を定義するだけでなく、 main() fred`のインスタンスを返すことを宣言することになります。 I.e. コードは次のように解析されます。

struct fred { int x; long y; } main()
{
  return 0; /* invalid return type, expected fred type */
}


41


型宣言の中括弧の後のセミコロンは、言語に必要です。 Cの初期のバージョンからそうなっています。

そして、はい、人々はあなたがちょうどそこに出した宣言を実際に行います。 メソッド内にスコープ型を作成するのに便利です。

void例(){struct {int x;}} s1; s1.x = 42。

struct ADifferentType {int x;} ; }

この場合、なぜセミコロンが必要なのかは明らかです。 なぜヘッダファイルで宣言するのがより一般的な場合に必要なのか、私にはわかりません。 私の予想は、これは歴史的なことであり、コンパイラの記述を容易にするために行われたことです。


15


グループ化のためにブレースが必要な場合でも、クラスは宣言であるためだと思います。 そして、はい、Cではあなたができるという歴史的な議論があります

struct
{
  float x;
  float y;
} point;

Cでも似たようなことができるはずです、 `class`宣言が同じように振る舞うことは意味があります。


8


それはのために短いです

クラスMyClass {
.
.
.
;

// instance declaration
MyClass MyInstance; //セミコロンはこちら

クラス宣言の中括弧の後のセミコロンは実際には大きすぎますが、Cがどのように定義されるかです。 変数宣言の後のセミコロンは常に必要であり、意味があります。


3


私はそのような宣言を使いません

class MyClass
{
.
.
.
} MyInstance;

しかし、この場合、なぜセミコロンがあるのか​​理解できます。 なぜならそれは `int a;`のような変数宣言だからです。

'MyInstance’セミコロンを省略できるので、一貫性のためにおそらくそこに留まります。


3


それは互換性のために `struct`の後に必要です、そしてどのようにあなたはこれを望みますか:

struct MyStruct { ... };
class  MyClass  { ... }    //inconsistency


2


C / Cではステートメント終了記号です。 すべての文は;で終わります。あいまいさを避けるため(そして構文解析を簡単にするため) 文法はこの点で一貫しています。 クラス宣言(あるいはそのためのブロック)は複数行の長さで、\ {}で区切られていますが、それでも単なるステートメントです(\ {}はステートメントの一部です)。 (;はセパレータ/デリミタではありません)

あなたの例では

クラスMyClass {...} MyInstance。

完全なステートメントです。 宣言されたクラスの複数のインスタンスを単一のステートメントで定義できます

クラスMyClass {...} MyInstance1、MyInstance2。

これは、1つのステートメントでプリミティブ型の複数のインスタンスを宣言することと完全に一致しています。

int a、b、c。

そのようなクラスやインスタンスの宣言がよく見られない理由は、インスタンスができるのは「唯一の」ということです。 大域変数にしてください。静的なものやPlain Old Data構造体でない限り、大抵はグローバルオブジェクトは必要ありません。