努努努努 发表于 2016-8-11 08:44:52

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语句吗

迷雾少年 发表于 2016-8-11 09:36:01

不是,返回到else那里

lx_Zz 发表于 2016-8-11 09:37:41

你是想说汇编么、
1、函数调用前是会把下一条汇编语句的地址压入栈中、以便函数的返回的时候能继续按流程运行、
2、编译器会优化你的程序、

努努努努 发表于 2016-8-11 09:47:08

迷雾少年 发表于 2016-8-11 09:36
不是,返回到else那里

else 不是不会执行吗~

迷雾少年 发表于 2016-8-11 09:52:45

努努努努 发表于 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 10:02:18

迷雾少年 发表于 2016-8-11 09:52
你可以反汇编看下

谢谢!
页: [1]
查看完整版本: C语言返回地址的一个疑惑