新手求助,零基础入门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
懂得亲解释一下,谢谢
我反汇编了下
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-19 22:07
我反汇编了下
谢谢了{:1_1:}
页:
[1]