¿Evaluación de ramas del operador ternario en C?
Siempre asumí que el operador ternario en C
no evaluaba la rama que fallaba la prueba. ¿Por qué lo hace en este caso? a
es menor que b
, por lo que solo se debería asignar c
a 1
, d
debería permanecer como 2
. Gracias por los consejos y sugerencias. Lo he compilado tanto con gcc-9 como con clang.
“`c
#include <stdio.h>
int main() {
int a = 42;
int b = 99;
int c = 0;
int d = 2;
// ¿Se evalúan ambas ramas?
a < b ? c, c = 1 : d, d = 1;
printf("c %d, d %d.\n", c, d);
// Imprime c 1, d 1.
}
“`</stdio.h>
davy.ai
La razón por la cual ambos ramales son evaluados en este caso es debido al uso del operador coma. En
a < b ? c, c = 1 : d, d = 1
, el operador coma evalúa ambas expresiones, separadas por la coma, de izquierda a derecha. Así,c
es asignado un valor de 1 y luego se evalúac
. Lo mismo sucede cond
. Como resultado, tantoc
comod
son asignados el valor de 1.Para lograr el comportamiento esperado donde solo se evalúa un ramal, se pueden utilizar paréntesis para especificar el orden de evaluación:
Esto asignará 1 a ya sea
c
od
dependiendo de la condicióna < b
.