El operador coma , en el lenguaje C combina dos (o más) expresiones, evaluándolas en orden de izquierda a derecha y devolviendo el valor de la última expresión:
int x = (f(), g()); // se llaman f() y g(), x == resultado de g()
Se usa más comúnmente en bucles for:
for(int i = 0, j = 10; i < j; ++i, --j) { ... }
Cuándo es útil:
Trampas:
Pregunta: ¿Qué imprimirá el siguiente código?
int a = 1; int b = (a = 2, a + 3); printf("%d ", b);
Respuesta: Imprimirá "5". Primero se asigna a=2, luego la expresión a+3 evalúa 2+3=5, y precisamente este valor se asignará a la variable b.
Historia
En un proyecto en C, un desarrollador utilizó el operador coma sin paréntesis en una función de retorno:
return x++, y++;Se esperaba que la función devolviera y+1, pero en realidad return solo toma el resultado de la expresión de la derecha, mientras que a la izquierda x++ se evalúa por separado. Esto confundió al usuario, ya que el resultado del return fue diferente de lo esperado.
Historia
En un bucle for, un programador accidentalmente puso una coma en lugar de un punto y coma:
for(i=0, i<10, i++) ...El programa se compiló, pero el bucle se ejecutó solo una vez, ya que la expresión i<10, i++ en las condiciones del for siempre devuelve el valor de la última expresión (i++), y no la condición de continuación del bucle.
Historia
Al escribir macros, uno de los desarrolladores definió:
#define DO(x, y) x, y int v = DO(f(), g());Se esperaba que ambas funciones se llamaran, pero olvidó poner paréntesis. Como resultado, solo se llamó a f(); el valor de g() no se asignó a v. El uso correcto es:
#define DO(x, y) ((x), (y)).