Operador coma

Operador coma
Información sobre la plantilla
Concepto:La coma puede ser un elemento de puntuación (separador de expresiones) y un operador, dando lugar a las denominadas expresiones con coma

Operador coma. En C++ la coma puede ser un elemento de puntuación (separador de expresiones) y un operador, dando lugar a las denominadas expresiones con coma. En una "expresión de coma", cada operando es evaluado como una expresión, pero los resultados obtenidos anteriormente se tienen en cuenta en las subsiguientes evaluaciones

Sintaxis

expresion , expresion-de-asignacion

Comentario

La coma separa elementos en las listas de parámetros de las funciones, también se usa como un operador en las expresiones con coma. Es legal mezclar ambos usos, pero deben usarse paréntesis para distinguirlas y evitar ambigüedades. Por ejemplo, la expresión:

func(i, (j = 1, j + 4), k);

Llama a func con tres argumentos: (i, 5, k), no cuatro. Cuando la coma se usa como operador, por ejemplo: E1, E2, el operando de la izquierda E1 es evaluado como una expresión void (no produce ningún resultado), después se evalúa la expresión E2 de la derecha, su valor y tipo son los que toma la expresión de coma. Por recursión, la expresión: E1, E2, ..., En, produce la evaluación de izquierda a derecha de todas las expresiones Ei y la expresión total adopta el valor de En. Es el operador de precedencia más baja de todos.

Ejemplos

sum = (i = 3, i++, i++);      // sum = 4, i = 5
func((exp1, exp2), (exp3, exp4, exp5)); // llama a func con dos  argumentos
return pass ? (puts("Acierto!"), 0) : (puts("Fallo!"), 1);

La invocación a func en la segunda línea se realiza con dos argumentos, los resultados de exp2 y exp5 respectivamente. En la tercera línea, el programa devuelve 0 o 1 según el valor pass, pero previamente indica el resultado en pantalla, ya que las dos alternativas conducen a la ejecución de una expresión con coma. El operador coma debe ser usado con moderación y es frecuentemente utilizado en los bucles for como en el ejemplo.

void reverse (char s[]) {      // invertir la cadena s
   int c, i, j;
   for ( i = 0 , j = strlen(s)-1 ; i < j ; i++,  j--) {
      c = s[i],  s[i] = s[j],  s[j] = c;
   }
}

Esta posibilidad, incluir expresiones con coma en el argumento <[incremento]> de los bucles, permite combinaciones muy interesantes y una notación muy compacta, aunque resultan algo crípticas en una primera lectura.

Véase también

Fuente