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