int a[] = {1,2,}; Bizarre virgule permis. Une raison en particulier?

Peut-être que je ne suis pas de cette planète, mais il me semble que la suite devrait être une erreur de syntaxe:

int a[] = {1,2,}; //extra comma in the end

Mais il ne l'est pas. J'ai été surpris lorsque ce code est compilé sur Visual Studio, mais j'ai appris à ne faire confiance à MSVC compilateur dans la mesure du C++ les règles, j'ai donc vérifié la norme, et qu'elle est autorisé par la norme. Vous pouvez voir 8.5.1 pour les règles de grammaire si vous ne me croyez pas.

int a[] = {1,2,}; Bizarre virgule permis. Une raison en particulier?

Pourquoi est-ce possible? Cela peut sembler stupide, inutile, mais je veux que vous compreniez pourquoi je demande. Si c'était un sous-cas général règle de grammaire, je le comprends ils ont décidé de ne pas faire de la grammaire générale plus difficile de refuser un redondante virgule à la fin d'une liste d'initialiseur. Mais non, la virgule supplémentaire est explicitement permis. Par exemple, il n'est pas permis d'avoir une redondance virgule à la fin d'une fonction-appel de la liste d'arguments (quand la fonction prend ...), ce qui est normal.

Donc, encore une fois, est-il une raison particulière à cette redondant virgule est explicitement permis?

Chacun semble être d'accord sur la facilité d'ajouter une nouvelle ligne, mais ce sont des la définition des spécifications de langue vraiment à vous soucier de telles choses? Si ils sont vraiment à la compréhension, alors pourquoi n'ont-ils pas ignorer un manque ; quand il est clair prochain jeton est effectivement une instruction suivante.
Oui, la langue concepteurs de considérer de telles choses. Vous permettant de déposer des points-virgules aurait un impact beaucoup plus important et serait très ambigu dans de nombreuses parties de la langue (rappelez-vous, l'espace n'est pas sémantique en C). Une virgule supplémentaire est ce cas n'est pas ambigu. Un supplément de point-virgule est presque jamais ambigu, et est donc autorisé. Dans le cas où il est ambigu (après un for() par exemple), ajoutant qu'il lance un avertissement du compilateur.
Il est ambigu pour un lecteur humain, et est souvent une erreur. C'est pourquoi il lance un avertissement. De même if (x = 1) n'est pas ambigu dans la grammaire, mais il est très ambiguë à l'homme, et donc jette un avertissement.
Votre if exemple n'est pas ambigu. Je ne pense pas que "ambigu" les moyens ce que vous pensez que cela signifie!
Aussi longtemps que nous sommes d'accord que c'est quelque chose d'utile pour le compilateur pour nous protéger, alors qu'une virgule dans une déclaration de tableau n'est pas quelque chose d'utile pour le compilateur pour nous protéger.

OriginalL'auteur Armen Tsirunyan | 2011-08-12