Red de conocimiento informático - Material del sitio web - ¿Cómo calcular "16" a continuación en el Grado 1 C?

¿Cómo calcular "16" a continuación en el Grado 1 C?

No vale la pena profundizar en este tipo de problemas, porque cuando se escribe código fuente en C/C++, se debe tener en cuenta que una variable se puede modificar varias veces en una expresión. A juzgar por la captura de pantalla de vc6.0, el resultado de la versión de depuración es 16 y la versión de lanzamiento es 18. Para profundizar en esta cuestión, podemos entenderla desde la perspectiva del desmontaje. Pero recuerde no escribir dicho código en el futuro e intente no modificar las variables en la expresión dos veces. /Versión de depuración del código de desensamblado:

9:printf("%d\n",? (++b)?+?(++b)?+?(++b)); ?//Este es el código fuente

00401023mov?eax,dword?ptr?[b]?//Guardar el valor de b en el registro eax

00401026add?eax,1 ? //dadd 1?//Guardar b en ecx aquí, ecx=4

0040102Fadd?ecx,1?//Aquí ecx+1? Entonces, ecx=5

00401032mov ?dword?//Guardar la variable b en edx

00401038add?edx,dword?//es 5+5?edx?=10

0040103Bmov?eax,dword?[ b]?//eax=5?

0040103Eadd?eax,1? //eax=6?

00401041mov?dword?ptr?[b],eax? //Tenga en cuenta que esta vez el valor de b se ha convertido en 6

00401044add?edx,dword?ptr?[b]? // ¿Se suma 6 al valor edx original de 10? Por lo tanto, el resultado es 16

00401047mov?esi,esp?

00401049pushedx?// Aquí están los parámetros de la función printf en la pila.

0040104Apushoffset?___xi_z+104h?(00404410)

0040104Fcalldword?ptr?[__imp__printf?(004050a4)]

00401055add?esp,8

00401058cmp?esi,esp

0040105Acall_chkesp?(0040108e)

La situación es diferente cuando se generan compilaciones de lanzamiento.