7
votes

Quand un point-virgule après} est-il mandaté en C / C ++?

if(...) {
  ...
}
It seems in the above case a ; is optional,when is a semicolon after } necessary in c/c++?

2 commentaires

Semicolon Il n'y a pas de facultatif. Ce si (a) si (b) {...} else {...} signifie une chose, tandis que si (a) si (b) {...}; else {...} est une erreur de syntaxe ( else sans correspondance si ).


@Adamrosenfield Sont votre connaissance de tout autre construct, comme if-ele , do-tandis que et try-attraper où le point-virgule après la corde peut être illégal?


3 Réponses :


15
votes
class A {};  // same for `struct
enum E {};   // enum class (c++0x)
int a[] = {1,2};  // array or object initialization

5 commentaires

tout rationnel derrière tout cela?


@cpuer Ce n'est pas une justification mais struct {int i; } S; est significatif en C et C ++. Lorsque vous n'avez pas besoin de l'objet (s) (ici, s ), alors le ; reste.


@CPuer: Pour la classe Classe et Enum Exemples, j'ai expliqué dans les commentaires sur la réponse d'Ernest. Pour les initialisations de tableau ou d'objet, vous avez besoin d'un point-virgule simplement parce qu'ils sont des déclarations et toutes les déclarations sont terminées par ; s :)


@cpuer, comme @LUC a dit, puisque dans C ++ Vous pouvez déclarer des objets / des pointeurs après la déclaration Classe / STRIT / ENUM Déclaration. Mettre un ; aide l'analyseur à saisir le nom pour déclarer n'importe quel objet. Depuis la fonction / Espace de noms 'ne sont pas de type; le ; `après eux n'est pas obligatoire.


N'oubliez pas un do { ...} tandis que (...);



6
votes

Un point-virgule en soi est une déclaration vide , et vous pouvez ajouter des extraités n'importe où une déclaration est légale. Il serait donc légal de mettre un point-virgule juste après les accolades suivant votre si , bien qu'il ne soit pas lié au si du tout. Le seul endroit où je peux penser où un point-virgule est requis juste après une cordette après une déclaration de classe en C ++.


2 commentaires

Pourquoi ; est requis après la déclaration de classe mais non après la déclaration de fonction? L'analyseur C ++ ne peut pas l'analyser sans le ; dans ce cas?


@CPuer: Parce que vous pouvez déclarer des instances sur le site de définition. Par exemple: struct abc {int foo; Barre int; } exemple; crée une variable nommée exemple de type abc .



3
votes

Un point-virgule après une corail de fermeture est manadiatoire s'il s'agit de la fin de la déclaration . S'il s'agit de la fin de la déclaration de bloc , aucun point-virgule n'est nécessaire et si l'on utilise, il fait une déclaration supplémentaire , qui peut être illégale si c'est le milieu d'un si - ele ou un est - tandis que (ou un essayez - attrape en C ++)

Les points-virgules sont requis de nombreux endroits pas après une attelle proche (à la fin de toute déclaration, à l'exception d'une déclaration de bloc, à la fin de toute déclaration, même s'il n'y a pas de } < / code>, dans un pour clause, etc., mais généralement les accolades ne sont impliquées dans aucun de ceux-ci.


4 commentaires

Un do-tandis que a besoin d'un demi-point à la fin!


@RubenVB: Si vous essayez de mettre un ; après le } dans un faire - pendant boucle, vous " ll obtenir une erreur de syntaxe.


Mais il est nécessaire après la finale ) .


@Adamrosenfield Sont votre connaissance de tout autre construct, comme if-ele , do-tandis que et try-attraper où le point-virgule après la corde peut être illégal?