焦糖橙子 发表于 2018-1-23 22:12:31

萌新求助各位大佬

这个程序为什么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:27:31

本帖最后由 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:28:43

说白了就是编译器的问题。。。编译器不一样结果就可能不一样

焦糖橙子 发表于 2018-1-23 22:41:15

Charles未晞 发表于 2018-1-23 22:27
用Visual C++ 6.0编译
输出j=8,q=22
用VC中的debug反汇编:

11行的EAX怎么会加一呢

焦糖橙子 发表于 2018-1-23 22:44:04

Charles未晞 发表于 2018-1-23 22:27
用Visual C++ 6.0编译
输出j=8,q=22
用VC中的debug反汇编:

这个自加的结果不应该是6+7+8=21么

焦糖橙子 发表于 2018-1-23 22:48:04

Charles未晞 发表于 2018-1-23 22:27
用Visual C++ 6.0编译
输出j=8,q=22
用VC中的debug反汇编:

啊突然想通了,谢谢大神{:10_254:}
页: [1]
查看完整版本: 萌新求助各位大佬