累加问题
#include "stdio.h"voidmain()
{
int i ,j ,p ,q ;
i=5,j=5;
p=(i++)+(i++)+(i++);
q=(++j)+(++j)+(++j);
printf("i=%d j=%d p=%d q=%d\n",i,j,p,q);
}
i=8,j=8,p=15,q=22;
求解释 原来很迷茫 现在在学习汇编,然后知道编译器的问题
其实你不用懂你只要知道i++ --i 语法意思就可以 后面学习玩C,从汇编层面来看就会迎刃而解,现在讲也都是字面意思还是会忘 {:5_99:} 不主动 发表于 2018-6-2 10:16
还是想知道字面意思{:5_109:} 首先同意二楼的说法
这里简单解释一下结果
ij为8因为都自增了3次,容易理解
p为15因为后置加加是先使用再自增,所以为三个5的和
关键是q,求解过程这样的,注意看括号
((++j)+(++j))+(++j)
先完成两次自增变为7相加得到14
然后变成
14+(++j)
j自增变成8,最终即为22
BngThea 发表于 2018-6-2 10:23
首先同意二楼的说法
这里简单解释一下结果
使用加法是不是必须要确定加号两边的值才可以相加{:5_104:} 不主动 发表于 2018-6-2 10:39
使用加法是不是必须要确定加号两边的值才可以相加
那是当然 不要说代码和你的不一样
完全复制你的代码
#include <stdio.h>
int main(void)
{
int i, j, p, q;
i = 5, j = 5;
p = (i++) + (i++) + (i++);
q = (++j) + (++j) + (++j);
printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);
return 0;
}
int main(void)
{
010A7700push ebp
010A7701mov ebp,esp
010A7703sub esp,0F0h
010A7709push ebx
010A770Apush esi
010A770Bpush edi
010A770Clea edi,
010A7712mov ecx,3Ch
010A7717mov eax,0CCCCCCCCh
010A771Crep stos dword ptr es:
int i, j, p, q;
i = 5, j = 5;
010A771Emov dword ptr ,5
010A7725mov dword ptr ,5
p = (i++) + (i++) + (i++);
010A772Cmov eax,dword ptr
010A772Fadd eax,dword ptr
010A7732add eax,dword ptr
010A7735mov dword ptr ,eax
010A7738mov ecx,dword ptr
010A773Badd ecx,1
010A773Emov dword ptr ,ecx
010A7741mov edx,dword ptr
010A7744add edx,1
010A7747mov dword ptr ,edx
010A774Amov eax,dword ptr
010A774Dadd eax,1
010A7750mov dword ptr ,eax
q = (++j) + (++j) + (++j);
010A7753mov eax,dword ptr
010A7756add eax,1
010A7759mov dword ptr ,eax
010A775Cmov ecx,dword ptr
010A775Fadd ecx,1
010A7762mov dword ptr ,ecx
010A7765mov edx,dword ptr
010A7768add edx,1
010A776Bmov dword ptr ,edx
010A776Emov eax,dword ptr
010A7771add eax,dword ptr
010A7774add eax,dword ptr
010A7777mov dword ptr ,eax
printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);
010A777Amov eax,dword ptr
010A777Dpush eax
010A777Emov ecx,dword ptr
010A7781push ecx
010A7782mov edx,dword ptr
010A7785push edx
010A7786mov eax,dword ptr
010A7789push eax
010A778Apush offset string "i=%d j=%d p=%d q=%d\n" (01133E50h)
010A778Fcall _printf (0109BD9Bh)
010A7794add esp,14h
return 0;
010A7797xor eax,eax
}
010A7799pop edi
010A779Apop esi
010A779Bpop ebx
010A779Cadd esp,0F0h
010A77A2cmp ebp,esp
010A77A4call __RTC_CheckEsp (0109A383h)
010A77A9mov esp,ebp
010A77ABpop ebp
010A77ACret
#include <stdio.h>
int main(void)
{
int i, j, p, q;
i = 5, j = 5;
// *******************************
p = i + i + i;
i++;
i++;
i++;
p = (i++) + (i++) + (i++);
// *******************************
++j;
++j;
++j;
q = j + j + j;
q = (++j) + (++j) + (++j);
// *******************************
printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);
return 0;
}
int main(void)
{
00C37700push ebp
00C37701mov ebp,esp
00C37703sub esp,0F0h
00C37709push ebx
00C3770Apush esi
00C3770Bpush edi
00C3770Clea edi,
00C37712mov ecx,3Ch
00C37717mov eax,0CCCCCCCCh
00C3771Crep stos dword ptr es:
int i, j, p, q;
i = 5, j = 5;
00C3771Emov dword ptr ,5
00C37725mov dword ptr ,5
// *******************************
p = i + i + i;
00C3772Cmov eax,dword ptr
00C3772Fadd eax,dword ptr
00C37732add eax,dword ptr
00C37735mov dword ptr ,eax
i++;
00C37738mov eax,dword ptr
00C3773Badd eax,1
00C3773Emov dword ptr ,eax
i++;
00C37741mov eax,dword ptr
00C37744add eax,1
00C37747mov dword ptr ,eax
i++;
00C3774Amov eax,dword ptr
00C3774Dadd eax,1
00C37750mov dword ptr ,eax
p = (i++) + (i++) + (i++);
00C37753mov eax,dword ptr
00C37756add eax,dword ptr
00C37759add eax,dword ptr
00C3775Cmov dword ptr ,eax
00C3775Fmov ecx,dword ptr
00C37762add ecx,1
00C37765mov dword ptr ,ecx
00C37768mov edx,dword ptr
00C3776Badd edx,1
00C3776Emov dword ptr ,edx
00C37771mov eax,dword ptr
00C37774add eax,1
00C37777mov dword ptr ,eax
// *******************************
++j;
00C3777Amov eax,dword ptr
00C3777Dadd eax,1
00C37780mov dword ptr ,eax
++j;
00C37783mov eax,dword ptr
00C37786add eax,1
00C37789mov dword ptr ,eax
++j;
00C3778Cmov eax,dword ptr
++j;
00C3778Fadd eax,1
00C37792mov dword ptr ,eax
q = j + j + j;
00C37795mov eax,dword ptr
00C37798add eax,dword ptr
00C3779Badd eax,dword ptr
00C3779Emov dword ptr ,eax
q = (++j) + (++j) + (++j);
00C377A1mov eax,dword ptr
00C377A4add eax,1
00C377A7mov dword ptr ,eax
00C377AAmov ecx,dword ptr
00C377ADadd ecx,1
00C377B0mov dword ptr ,ecx
00C377B3mov edx,dword ptr
00C377B6add edx,1
00C377B9mov dword ptr ,edx
00C377BCmov eax,dword ptr
00C377BFadd eax,dword ptr
00C377C2add eax,dword ptr
00C377C5mov dword ptr ,eax
// *******************************
printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);
00C377C8mov eax,dword ptr
00C377CBpush eax
00C377CCmov ecx,dword ptr
00C377CFpush ecx
00C377D0mov edx,dword ptr
00C377D3push edx
00C377D4mov eax,dword ptr
00C377D7push eax
00C377D8push offset string "i=%d j=%d p=%d q=%d\n" (0CC3E50h)
00C377DDcall _printf (0C2BD9Bh)
// *******************************
printf("i=%d j=%d p=%d q=%d\n", i, j, p, q);
00C377E2add esp,14h
return 0;
00C377E5xor eax,eax
}
00C377E7pop edi
00C377E8pop esi
00C377E9pop ebx
00C377EAadd esp,0F0h
00C377F0cmp ebp,esp
00C377F2call __RTC_CheckEsp (0C2A383h)
00C377F7mov esp,ebp
00C377F9pop ebp
00C377FAret
可以看到
p = i + i + i;
i++;
i++;
i++;
相当于
p = (i++) + (i++) + (i++);
++j;
++j;
++j;
q = j + j + j;
相当于
q = (++j) + (++j) + (++j); 人造人 发表于 2018-6-2 14:09
不要说代码和你的不一样
完全复制你的代码
{:10_243:}不知道了 我的运行出来是22 人造人 发表于 2018-6-2 14:24
可以看到
相当于
辛苦了{:5_99:} 不主动 发表于 2018-6-2 14:38
不知道了 我的运行出来是22
嗯,这类语法在标准中的定义是"未定义"的,也就是说不同的编译器可能会有不同的结果
说白了就是编译器爱咋搞就咋搞
^_^
页:
[1]