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 dec
11. Por separado,c
se incrementa a 12.b == 11
es falso, ya queb
es 12.(b == c++)
es falso,(c-1)
se usa. Además, el incremento dec
a 12 debe completarse en este punto.c
es 12,c-1
es 11.d
se 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
b
se compara con el valor de la variablec
porque el operador posterior al incremento devuelve el valor de su operando antes de incrementarlo.Como los valores no son iguales entre sí (
b
se establece en 12 mientrasc
se 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
c
tiene el valor12
despué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
false
caso sucederá:c-1
pero desde que incrementóc
la condición enc++
, porc
lo 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 dec
se utiliza para calcularc - 1
, no la versión incrementa.c++
y++c
c++
es el operador posterior al incremento. El valor dec++
es 11, con el efecto secundario de hacerc == 12
.++c
tendrí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
else
estado 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