C语言返回地址的一个疑惑
intf(int a){ return a;
}
int main()
{ int x=1;
int y;
if(x>0)
y=f(x)
else
y=-f(x)
printf("%d",y);
}
请问如上这个小程序f()函数运行完后的返回地址是main()函数中的printf语句吗 不是,返回到else那里 你是想说汇编么、
1、函数调用前是会把下一条汇编语句的地址压入栈中、以便函数的返回的时候能继续按流程运行、
2、编译器会优化你的程序、 迷雾少年 发表于 2016-8-11 09:36
不是,返回到else那里
else 不是不会执行吗~ 努努努努 发表于 2016-8-11 09:47
else 不是不会执行吗~
你可以反汇编看下
int main()
{ int x=1;
013F1430push ebp
013F1431mov ebp,esp
013F1433sub esp,0D8h
013F1439push ebx
013F143Apush esi
013F143Bpush edi
013F143Clea edi,
013F1442mov ecx,36h
013F1447mov eax,0CCCCCCCCh
013F144Crep stos dword ptr es:
013F144Emov dword ptr ,1
int y;
if(x>0)
013F1455cmp dword ptr ,0
int y;
if(x>0)
013F1459jle main+3Ch (013F146Ch)
y=f(x);
013F145Bmov eax,dword ptr
013F145Epush eax
013F145Fcall f (013F11EAh)//调用f函数后一步步向下走
013F1464add esp,4
013F1467mov dword ptr ,eax
else
013F146Ajmp main+4Dh (013F147Dh)//来到这里就是else直接跳走到下面
y=-f(x);
013F146Cmov eax,dword ptr
013F146Fpush eax
013F1470call f (013F11EAh)
013F1475add esp,4
013F1478neg eax
013F147Amov dword ptr ,eax
printf("%d",y); //printf
013F147Dmov esi,esp
013F147Fmov eax,dword ptr
013F1482push eax
013F1483push 13F5D0Ch
013F1488call dword ptr ds:
013F148Eadd esp,8
013F1491cmp esi,esp
013F1493call __RTC_CheckEsp (013F113Bh)
} 迷雾少年 发表于 2016-8-11 09:52
你可以反汇编看下
谢谢!
页:
[1]