萌新求助各位大佬
这个程序为什么q输出是22而不是21?#include<stdio.h>
void main()
{
int i=5,j=5,p,q;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("%d,%d,%d,%d\n",p,q,i,j);
} 本帖最后由 Charles未晞 于 2018-1-23 22:29 编辑
用Visual C++ 6.0编译
输出j=8,q=22
用VC中的debug反汇编:
q=(++j)+(++j)+(++j);
0040102F mov eax,dword ptr //把j的值传到寄存器EAX,dword ptr 存放的是变量j
00401032 add eax,1 //EAX加1
00401035 mov dword ptr ,eax //EAX的值传到变量j,这两步实现第一个++j,此时j=6
00401038 mov ecx,dword ptr //把j的值传到寄存器ECX
0040103B add ecx,1 //ECX加1
0040103E mov dword ptr ,ecx //ECX的值传到变量j,这两步实现第二个++j,此时j=7
00401041 mov edx,dword ptr //把变量j传到EDX
00401044 add edx,dword ptr //再加上j的值,这一步实现了第一个加号的加法运算,内存中j变量的值仍是7
00401047 mov eax,dword ptr //把j的值传到寄存器EAX
0040104A add eax,1 //EAX加1
0040104D mov dword ptr ,eax //把EAX的值传送到变量j中,此时,变量j在内存中的值是8
00401050 add edx,dword ptr //EDX加上j的值,EDX中存放的是前面的第一个加法运算的结果14,最后EDX的值为22
00401053 mov dword ptr ,edx //把运算结果传到内存中变量q的地方,所以最后变量q为22 说白了就是编译器的问题。。。编译器不一样结果就可能不一样 Charles未晞 发表于 2018-1-23 22:27
用Visual C++ 6.0编译
输出j=8,q=22
用VC中的debug反汇编:
11行的EAX怎么会加一呢 Charles未晞 发表于 2018-1-23 22:27
用Visual C++ 6.0编译
输出j=8,q=22
用VC中的debug反汇编:
这个自加的结果不应该是6+7+8=21么 Charles未晞 发表于 2018-1-23 22:27
用Visual C++ 6.0编译
输出j=8,q=22
用VC中的debug反汇编:
啊突然想通了,谢谢大神{:10_254:}
页:
[1]