int a[] = {1,2,}; ¿Por qué se permite una coma final en una lista de inicializadores?

Resuelto Armen Tsirunyan asked hace 13 años • 21 respuestas

Quizás no soy de este planeta, pero me parecería que debería ser un error de sintaxis lo siguiente:

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

Pero no lo es. Me sorprendió cuando este código se compiló en Visual Studio, pero aprendí a no confiar en el compilador MSVC en lo que respecta a las reglas de C++, así que verifiqué el estándar y el estándar también lo permite . Puedes ver 8.5.1 para las reglas gramaticales si no me crees.

ingrese la descripción de la imagen aquí

¿Por qué está permitido esto? Esta puede ser una pregunta estúpida e inútil, pero quiero que entiendas por qué te la pregunto. Si fuera un subcaso de una regla gramatical general, lo entendería: decidieron no hacer más difícil la gramática general simplemente para no permitir una coma redundante al final de una lista de inicializadores. Pero no, la coma adicional está explícitamente permitida. Por ejemplo, no está permitido tener una coma redundante al final de una lista de argumentos de llamada a función (cuando la función toma ...), lo cual es normal .

Entonces, nuevamente, ¿hay alguna razón particular por la que se permita explícitamente esta coma redundante ?

Armen Tsirunyan avatar Aug 12 '11 23:08 Armen Tsirunyan
Aceptado

Facilita la generación de código fuente y también la escritura de código que puede ampliarse fácilmente en el futuro. Considere lo que se requiere para agregar una entrada adicional a:

int a[] = {
   1,
   2,
   3
};

... tienes que agregar la coma a la línea existente y agregar una nueva línea. Compare eso con el caso en el que el tres ya tiene una coma después, donde solo tiene que agregar una línea. Del mismo modo, si desea eliminar una línea, puede hacerlo sin preocuparse de si es la última línea o no, y puede reordenar las líneas sin tener que jugar con las comas. Básicamente significa que hay uniformidad en la forma de tratar las líneas.

Ahora piense en generar código. Algo como (pseudocódigo):

output("int a[] = {");
for (int i = 0; i < items.length; i++) {
    output("%s, ", items[i]);
}
output("};");

No hay necesidad de preocuparse por si el elemento actual que está escribiendo es el primero o el último. Mucho más sencillo.

Jon Skeet avatar Aug 12 '2011 16:08 Jon Skeet

Es útil si haces algo como esto:

int a[] = {
  1,
  2,
  3, //You can delete this line and it's still valid
};
Skilldrick avatar Aug 12 '2011 16:08 Skilldrick

Yo creo que es fácil de usar para el desarrollador.

int a[] = {
            1,
            2,
            2,
            2,
            2,
            2, /*line I could comment out easily without having to remove the previous comma*/
          }

Además, si por alguna razón tuvieras una herramienta que generaba código para ti; la herramienta no tiene que preocuparse por si es el último elemento de la inicialización o no.

vcsjones avatar Aug 12 '2011 16:08 vcsjones