夕阳游子 发表于 2014-11-18 21:48:48

新手求助,零基础入门c语言第二章3.16列题

零基础入门c语言第二章3.16列题#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);
}问题
”p“为什么等于15,在我看来,除去第一次先出来没有参加计算,每一次” i “都是加 1 的,出来计算的,应该是5+6+7=18
“q”为什么等于22,“j”每次都是加1出来计算的,应该是6+7+8=21
懂得亲解释一下,谢谢

风之残月 发表于 2014-11-19 22:07:51

我反汇编了下
5:            int i=5,j=5,p,q;
004109B8   mov         dword ptr ,5                        // i = (ebp-4) = 5
004109BF   mov         dword ptr ,5                        // j = (ebp-8) = 5
6:            p=(i++)+(i++)+(i++);
004109C6   mov         eax,dword ptr                 // eax = i = 5
004109C9   add         eax,dword ptr                 // eax = i + eax = 5+5=10
004109CC   add         eax,dword ptr                 // eax = i + eax = 10+5=15
004109CF   mov         dword ptr ,eax                // p = (ebp-0ch) = eax = 15
004109D2   mov         ecx,dword ptr                 // ecx = i = 5
004109D5   add         ecx,1                                                // ecx = ecx + 1 = 6
004109D8   mov         dword ptr ,ecx                // i = ecx = 6
004109DB   mov         edx,dword ptr                 // edx = i = 6
004109DE   add         edx,1                                                // edx = edx + 1 = 7
004109E1   mov         dword ptr ,edx                // i = edx = 7
004109E4   mov         eax,dword ptr                 // eax = i = 7
004109E7   add         eax,1                                                // eax = eax + 1 = 8
004109EA   mov         dword ptr ,eax                // i = eax = 8
7:            q=(++j)+(++j)+(++j);
004109ED   mov         ecx,dword ptr                 // ecx = (ebp-8) = j = 5
004109F0   add         ecx,1                                                // ecx = ecx + 1 = 6
004109F3   mov         dword ptr ,ecx                // j = ecx = 6
004109F6   mov         edx,dword ptr                 // edx = j = 6
004109F9   add         edx,1                                                // edx = edx + 1 = 7
004109FC   mov         dword ptr ,edx                // j = edx = 7
004109FF   mov         eax,dword ptr                 // eax = j = 7
00410A02   add         eax,dword ptr                 // eax = eax + j = 14
00410A05   mov         ecx,dword ptr                 // ecx = j = 7
00410A08   add         ecx,1                                                // ecx = ecx + 1 = 8
00410A0B   mov         dword ptr ,ecx                // j = ecx = 8
00410A0E   add         eax,dword ptr                 // eax = eax + j = 14 + 8 = 22
00410A11   mov         dword ptr ,eax                // q = eax = 22

也就是说
p = (i++) + (i++) + (i++); 顺序为p = i+i+i = 15 ,然后 i = i + 1 + 1 + 1 = 8
q = (++j) + (++j) + (++j); 顺序为q = 7 + 7 + 8 = 22, 然后j = j + 1 + 1 + 1 = 8

这是编译器的问题,这种问题研究它没什么意义,不同的编译器可能有不同的结果

夕阳游子 发表于 2014-11-22 22:46:16

风之残月 发表于 2014-11-19 22:07
我反汇编了下




谢谢了{:1_1:}
页: [1]
查看完整版本: 新手求助,零基础入门c语言第二章3.16列题