es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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>

Tags:  , , ,

Answer

  1. Avatar for 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úa c. Lo mismo sucede con d. Como resultado, tanto c como d 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:

    a < b ? (c = 1) : (d = 1);
    

    Esto asignará 1 a ya sea c o d dependiendo de la condición a < b.

Comments are closed.