Tengo una pregunta, cómo funciona el compilador en el siguiente código:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
No estoy seguro de por qué el resultado es d = 11.
Tengo una pregunta, cómo funciona el compilador en el siguiente código:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
No estoy seguro de por qué el resultado es d = 11.
Respuestas:
En
int d = (b == c++) ? (c+1) : (c-1);:c++es el valor actual dec11. Por separado,cse incrementa a 12.b == 11es falso, ya quebes 12.(b == c++)es falso,(c-1)se usa. Además, el incremento deca 12 debe completarse en este punto.ces 12,c-1es 11.dse inicializa a ese valor, 11.fuente
De acuerdo con el Estándar C (6.5.15 Operador condicional)
Entonces, en la expresión inicial de esta declaración
la variable
bse compara con el valor de la variablecporque el operador posterior al incremento devuelve el valor de su operando antes de incrementarlo.Como los valores no son iguales entre sí (
bse establece en 12 mientrascse establece en 11), entonces la sub-expresión(c-1)se evalúa la subexpresión.Según la cita, hay un punto de secuencia después de la evaluación de la condición del operador. Significa que después de la evaluación de la condición
ctiene el valor12después de aplicar el operador de incremento posterior a la variablec. Como resultado, la variable d se inicializa por el valor1(12 - 1).fuente
?:. Porque normalmente en C, la combinación++con otras operaciones en el mismo operando es un comportamiento indefinido. Y este código solo funciona de manera predecible porque?:tiene varias reglas especiales de copos de nieve.Debido a que la condición es falsa, por lo tanto, el
falsecaso sucederá:c-1pero desde que incrementócla condición enc++, porclo tanto, es ahora12. El resultado es 12 - 1, que es 11.EDITAR: Lo que OP no entendió fue el incremento de publicación.
Entonces, lo que realmente sucede es así:
fuente
c++en la condición. La condición es falsa, pero entonces el orginal valor decse utiliza para calcularc - 1, no la versión incrementa.c++y++cc++es el operador posterior al incremento. El valor dec++es 11, con el efecto secundario de hacerc == 12.++ctendría el valor de 12.Traducido a una declaración if regular, su código se vería así:
La pista aquí es que c se incrementa después de que se verifica la condición. Entonces ingresa el
elseestado pero c ya tiene el valor 12 allí.fuente
Consulte Operador ternario.
Sintaxis
Entonces escribiste
En esta situación, el resultado será 11 porque, después de verificaciones, el valor 'c' aumenta (c + 1 = 12) y solo después establece el valor 'd' como c (12) -1, que es 11.
Si usaste, por ejemplo:
El valor "c" se incrementaría antes de verificar el enunciado, por lo que sería verdadero y el valor "d" sería c (12) +1, que es 13.
fuente