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. J'ai été surpris lorsque ce code a été compilé sur Visual Studio, mais j'ai appris à ne pas faire confiance au compilateur MSVC en ce qui concerne les règles C ++, j'ai donc vérifié la norme et elle est également autorisée par la norme. Vous pouvez voir 8.5.1 pour les règles de grammaire si vous ne me croyez pas.
Pourquoi est-ce autorisé? C'est peut-être une stupide question inutile, mais je veux que vous compreniez pourquoi je pose la question. 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 simplement pour interdire une virgule redondante à la fin d'une liste d'initialisation. Mais non, la virgule supplémentaire est explicitement autorisée. Par exemple, il n'est pas autorisé d'avoir une virgule redondante à la fin d'une liste d'arguments d'appel de fonction (lorsque la fonction prend ...
), ce qui est normal .
Donc, encore une fois, y a-t-il une raison particulière pour laquelle cette virgule redondante est explicitement autorisée?
for()
par exemple), l'ajouter lève un avertissement du compilateur.
if (x = 1)
n'est pas ambigu dans la grammaire, mais il est très ambigu pour les humains, et lance donc un avertissement.
if
exemple n'est pas ambigu non plus. Je ne pense pas que "ambigu" signifie ce que vous pensez que cela signifie!
;
quand il est clair que le prochain jeton est en fait une prochaine déclaration.