Je ne suis peut-être pas de cette planète, mais il me semble que ce qui suit devrait être une erreur de syntaxe :
int a[] = {1,2,}; //extra comma in the end
Mais ce n'est pas le cas. J'ai été surpris par la compilation de ce code sur Visual Studio, mais j'ai appris à ne pas faire confiance au compilateur MSVC en ce qui concerne les règles du C++. est également autorisé par la norme. Si vous ne me croyez pas, vous pouvez consulter le point 8.5.1 pour les règles de grammaire.
Pourquoi cela est-il autorisé ? Il s'agit peut-être d'une question stupide et inutile, mais je veux que vous compreniez pourquoi je vous la pose. S'il s'agissait d'un sous-cas d'une règle de grammaire générale, je comprendrais - ils ont décidé de ne pas rendre la grammaire générale plus difficile juste pour interdire une virgule redondante à la fin d'une liste d'initialisateurs. Mais non, la virgule supplémentaire est explicitement autorisé. Par exemple, il n'est pas permis d'avoir une virgule redondante à la fin d'une liste d'arguments d'un appel de fonction (lorsque la fonction prend ...
), ce qui est normal .
Alors, encore une fois, y a-t-il une raison particulière pour laquelle cette virgule redondante est explicitement autorisé ?
0 votes
Notez également que l'indentation de la syntaxe du VIM semble favoriser ce style - j'ai constaté que l'indentation peut être un problème si vous n'utilisez pas la virgule supplémentaire.
12 votes
Tout le monde semble être d'accord sur la "facilité d'ajouter une nouvelle ligne" - mais est-ce que les les personnes définir les spécifications linguistiques se préoccupe vraiment de ces choses ? S'ils sont vraiment si compréhensifs, pourquoi n'ignorent-ils pas qu'il manque un
;
lorsqu'il est clair que le prochain jeton est en fait une déclaration suivante.36 votes
@YetAnotherUser : Oui, les concepteurs de langage prennent en compte ce genre de choses. Permettre de supprimer les points-virgules aurait un impact beaucoup plus important et serait très ambigu dans de nombreuses parties du langage (n'oubliez pas que les espaces blancs ne sont pas sémantiques en C). Dans ce cas, une virgule supplémentaire n'est pas ambiguë. Un point-virgule supplémentaire n'est presque jamais ambigu et est donc également autorisé. Dans le cas où il est ambigu (après un
for()
par exemple), son ajout provoque un avertissement du compilateur.1 votes
Inversez votre question, et vous obtiendrez : "Pourquoi cela devrait-il être explicitement refusé ?" Avez-vous une réponse pour que ?
0 votes
@Rob : +1, mais un point-virgule après un
for()
n'est pas du tout "ambiguë".5 votes
@Tomalak : C'est ambigu pour un lecteur humain, et c'est souvent une erreur. C'est pourquoi un avertissement est émis. Dans le même ordre d'idées
if (x = 1)
n'est pas ambiguë dans la grammaire, mais elle est très ambiguë pour les humains, ce qui déclenche un avertissement.3 votes
@Rob : En quoi est-ce ambigu ? C'est bien défini ce que
for (a; b; c);
signifie. Il y a non Il n'y a pas d'ambiguïté, ni pour le compilateur, ni pour le programmeur. Qu'il s'agit souvent d'une erreur et qu'il est facile de la manquer est pertinent.12 votes
@Rob : Votre
if
n'est pas ambigu non plus. Je ne pense pas que le terme "ambigu" signifie ce que vous pensez qu'il signifie !4 votes
@Tomalak : Vous avez raison de dire que c'est sans ambiguïté, mais dans 87% des cas, ce n'est pas non plus ce que veut le programmeur.
1 votes
Je me suis tiré une balle dans le pied à plusieurs reprises avec ce problème en javascript ; IE (bien sûr) n'aime pas ça et vomit quand il en trouve un, mais les autres navigateurs l'acceptent.
1 votes
@Alex : En effet. Mais "ambigu" n'est pas le terme correct.
5 votes
Tant que nous sommes d'accord sur le fait qu'il s'agit de quelque chose d'utile dont le compilateur doit nous protéger, alors qu'une virgule de fin dans une déclaration de tableau n'est pas quelque chose d'utile dont le compilateur doit nous protéger.
3 votes
Je trouve cette fonctionnalité indispensable, et cela me met hors de moi lorsque je travaille avec des langages qui interdisent la virgule de fin (SQL, je vous regarde vous )
0 votes
Ce qui est le plus surprenant dans ce domaine, c'est de voir comment des choses aussi insignifiantes suscitent un intérêt aussi disproportionné et une telle frénésie de vote.
1 votes
Très utile et souvent utilisé dans les enum
1 votes
Plusieurs questions connexes : stackoverflow.com/questions/2311864/ , stackoverflow.com/questions/6372650/trailing-commas-and-c , stackoverflow.com/questions/792753/ , stackoverflow.com/questions/2361265/why-is-this-c-snippet-legal . La dernière pourrait être considérée comme un doublon, bien qu'elle demande C# au lieu de C++.
1 votes
@GeneBushuyev : fr.wikipedia.org/wiki/Parkinson%27s_law_of_triviality
0 votes
J'aimerais aussi que cela soit autorisé pour les paramètres des modèles !
0 votes
Qu'en est-il de l'utilisation de la virgule Yoda ? int a[] = {,1,2} ; stackoverflow.com/questions/10483635
0 votes
Je ne sais pas combien d'entre vous utilisent SQL, mais il ne dispose pas de cette fonctionnalité et les virgules peuvent sembler absolument antagonistes. Je suis très heureux de savoir que les développeurs C et C++ ont pris le temps de rendre cette petite chose beaucoup plus facile à utiliser. (et tant d'autres auxquelles nous ne pensons même pas) Et ce fil de discussion est génial ! Maintenant, je sais que ce n'est PAS indéfini d'une manière ou d'une autre et que je suis autorisé à l'utiliser. Et c'est la question qui m'a répondu.