Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


4.9.5  Operador Coma

§1  Sinopsis

En C++ la coma puede ser un elemento de puntuación (separador de expresiones 3.2.6) y un operador, dando lugar a las denominadas expresiones con coma ( 4.10.5).

§2  Sintaxis

expresion , expresion-de-asignacion

§3  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 ( 4.9.0a) más baja de todos.

§4  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;
   }
}

Como ejercicio, intente el lector desentrañar la lógica de funcionamiento de la función reverse, que recibe una matriz de caracteres y la invierte. Como ayuda, tenga en cuenta que el argumento <[incremento]> del bucle for ( 4.10.3), es una expresión con coma.  Como complemento, intente figurarse como se utiliza la cadena resultante si la función se define como devolviendo void.

Observe que 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.