ProgramaciónDesarrollador C, programador de sistemas

Explique cómo funciona el operador coma (comma operator) en el lenguaje C. ¿Cuándo tiene sentido usarlo, con qué errores suelen encontrarse los desarrolladores al usarlo y qué efectos inesperados hay?

Supere entrevistas con el asistente de IA Hintsage

Respuesta

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:

  • Cuando es necesario escribir varias expresiones de manera concisa, especialmente en inicializaciones o incrementos.

Trampas:

  • La precedencia de la coma es muy baja, lo cual es importante en expresiones complejas;
  • Su uso fuera de contexto (por ejemplo, en return o asignaciones) puede llevar a resultados inesperados;
  • Usarlo sin paréntesis puede confundir al programador y al compilador.

Pregunta capciosa

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.


Ejemplos de errores reales


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)).