Red de conocimiento informático - Aprendizaje de programación - principal() { int i=5,j; j=(++i)+((++i)+(++i)+(++i)+(++i)*2; printf ("%d %d\n",i,j);

principal() { int i=5,j; j=(++i)+((++i)+(++i)+(++i)+(++i)*2; printf ("%d %d\n",i,j);

Para resolver el misterio, descargué VC6.0 especialmente. La computadora entró en conflicto con VS2010, así que lo instalé en otra computadora.

Después de probarlo, de hecho es un gran problema. El resultado es j=63 en modo de lanzamiento y j=59 en modo de depuración.

●¿Por qué es igual a 59? Invierta el exe en modo de depuración. Al compilar, descubrí que el orden de las operaciones era anormal. Primero calculé la mitad del corchete, luego salté para ejecutar otro corchete y luego salté hacia atrás para calcular la otra mitad del corchete. muy anormal:

Primero, calcule ++ primero i;++i;++i;

Entonces la expresión se convierte en (++i) + (i+ i+i)*2

Dos, luego calcula i +i;

Entonces la expresión se convierte en (++i) + (16+i)*2

Tres, luego calcula ++i;

¡Como resultado, la expresión se convierte en j= 9+(8+8+9)*2=59!

●El código de desmontaje es el siguiente (simplificado, el uso de las variables i y j parece intuitivo)

mov [i], 5

mov [j], 0

mov eax, [i] //eax=5, calcular ++i

ad eax, 1 //eax=6<

mov [ i], eax //i=6

mov ecx, [i] //ecx=6, calcular++i

ad ecx, 1 //ecx=7< / p>

mov [i], ecx //i=7

mov edx, [i] //edx=7, calcular++i

ad edx, 1 //edx = 8

mov [i], edx //i=8

mov eax, [i] //eax=8, calcular 8+8

anuncio eax, [i] //eax=8+i=16

mov ecx, [i] //ecx=8, cálculo++i

ad ecx, 1 // ecx=9

mov [i], ecx //i=9

ad eax, [i] //eax=16+9=25, presta atención a i+i+ ¿Cómo me convierto en 8+8+9

mov edx, [i] //edx=i=9

lea eax, [edx+eax*2]//eax= 9+25*2=59

mov [j], eax //j=59

mov ecx, [j]

empujar ecx

mov edx, [i]

push edx

empujar formato de desplazamiento; "=%d,j=%d\n"

Llamar _prntf

Piénselo, ¿deberíamos aprender el lenguaje C o el compilador? Parece que este código fuente no es para leer, sino para resolver acertijos. He decidido abandonar el operador ++ cuando aprenda el lenguaje C en el futuro.

Adjunto: Pregunta, ¿por qué el modo de depuración de VC++6.0 es i=5

j = (++i) + (++i) + (i++) + ( i++); // j = 28

j = (i++) + (i++) + (++i) + (++i); = (i++) + (++i) + (i++) + (++i); // j = 25