user-0 提问: int max(int a,int b)默认返回值的问题

回复:
user: user-0
content: 引用 8 楼 u011779875 的回复:c=max(a,b);   00A1403  mov         eax,dword ptr [b]    000A1406  push        eax    000A1407  mov         ecx,dword ptr [a]    000A140A  push        ecx    000A140B  call        max (0A1109h)    000A1410  add         esp,8    000A1413  mov         dword ptr [c],eax  看到了吗 用俩个参数的时候压栈分别用了eax ecx 你是这样调用的 c=max(2,3); c默认调用从右向左 这样的话 eax保存的是2 所以你换成 c=max(3,2); 返回值就是3了 专业吧 20分都给我吧 他们 都不专业 哈哈  汇编确实是一个好东西啊！！

user: user-1
content: 引用 12 楼 u011779875 的回复:又没说好  最后指行得是这句话   if(a>b)   00A313AE  mov         eax,dword ptr [a]   00A313B1  cmp         eax,dword ptr [b] 因为不成立 return没执行  最后留下的是   00A313AE  mov         eax,dword ptr [a] ++ 有返回值的函数的返回值，不是随机的。 而是运算的结果（程序返回一个值）； 或者计算残留的值（程序没有返回一个值）。  X86,32Bits, 有些类型(如int)，是eax 寄存器的残留值，有些是（如 long long) edx:eax, 浮点数类型，是寄存器 ST，即寄存器堆栈的栈顶。  其他时候， eax 可能是个指针，指向返回值的地址。  X86，X64 64 Bits ,int 可能是rax(r0) 寄存器的残留值

user: user-2
content: 引用 8 楼 u011779875 的回复:c=max(a,b);   00A1403  mov         eax,dword ptr [b]    000A1406  push        eax    000A1407  mov         ecx,dword ptr [a]    000A140A  push        ecx    000A140B  call        max (0A1109h)    000A1410  add         esp,8    000A1413  mov         dword ptr [c],eax  看到了吗 用俩个参数的时候压栈分别用了eax ecx 你是这样调用的 c=max(2,3); c默认调用从右向左 这样的话 eax保存的是2 所以你换成 c=max(3,2); 返回值就是3了 专业吧 20分都给我吧 他们 都不专业 哈哈 高手

user: user-3
content: 引用 楼主 lubyam 的回复:  使用的是vs2012 test.c int max(int a,int b) {     if(a>b)     {         return a;     } }  -----------  int main(int argc,char *argv[]) {     int a=2;     int b=3;     int c=0;     c=max(a,b);     printf("%d",c); }   为什么输出来的是2而不是0； a = b或a < b怎么办？

user: user-4
content: 又没说好  最后指行得是这句话   if(a>b)   00A313AE  mov         eax,dword ptr [a]   00A313B1  cmp         eax,dword ptr [b] 因为不成立 return没执行  最后留下的是   00A313AE  mov         eax,dword ptr [a]

user: user-4
content: 引用 10 楼 Adol1111 的回复:[quote=引用 5 楼 lubyam 的回复:] 恩恩，，，但是    以前 我记得这样 就不会返回一个值 的 不是不返回，是返回一个随机结果（看系统，看编译器什么的）。C/C++只要求至少返回一次，没有要求所有路径都要有返回，但不代表不写就是不返回。建议每次写函数都检查是否所有路径都有返回值，C/C++编译器不能提示，只能看程序员自己了。[/quote] 有一点没说明白继续看 int max(int a,int b) { 00A31390  push        ebp   00A31391  mov         ebp,esp   00A31393  sub         esp,0C0h   00A31399  push        ebx   00A3139A  push        esi   00A3139B  push        edi   00A3139C  lea         edi,[ebp-0C0h]   00A313A2  mov         ecx,30h   00A313A7  mov         eax,0CCCCCCCCh   00A313AC  rep stos    dword ptr es:[edi]       if(a>b) 00A313AE  mov         eax,dword ptr [a]   00A313B1  cmp         eax,dword ptr [b]   00A313B4  jle         max+29h (0A313B9h)       {         return a; 00A313B6  mov         eax,dword ptr [a]       } }没说全  你里面比较的时候是这样的 eax,dword ptr [a]   所以eax最后留下的是a的值 因为ax被汇编成最后的return a; 所以最后的值是a的值

user: user-5
content: 引用 5 楼 lubyam 的回复:恩恩，，，但是    以前 我记得这样 就不会返回一个值 的 不是不返回，是返回一个随机结果（看系统，看编译器什么的）。C/C++只要求至少返回一次，没有要求所有路径都要有返回，但不代表不写就是不返回。建议每次写函数都检查是否所有路径都有返回值，C/C++编译器不能提示，只能看程序员自己了。

user: user-4
content: 汇编很重要 这个也是区分菜鸟和高手的 分水岭  首先呢 我也是菜鸟 我从来没思考过你的这个问题 其次呢 我面对问题的解决方法 明显就比你厉害 所以呢 做什么都厉害的 哈哈

user: user-4
content: c=max(a,b);   00A1403  mov         eax,dword ptr [b]    000A1406  push        eax    000A1407  mov         ecx,dword ptr [a]    000A140A  push        ecx    000A140B  call        max (0A1109h)    000A1410  add         esp,8    000A1413  mov         dword ptr [c],eax  看到了吗 用俩个参数的时候压栈分别用了eax ecx 你是这样调用的 c=max(2,3); c默认调用从右向左 这样的话 eax保存的是2 所以你换成 c=max(3,2); 返回值就是3了 专业吧 20分都给我吧 他们 都不专业 哈哈

user: user-4
content: 引用 6 楼 lubyam 的回复:[quote=引用 4 楼 u011779875 的回复:] max都返回最小值2了啊  它返回的时候把值复制给c 之后就销毁了函数里面的变量了  打印2那是自然的 要是打出的是0 那你就见鬼了 赶紧拨打110   函数里面的 a>b不成立的啊[/quote] 是啊  哦这样啊  返回值存在于eax 寄存器  既然你没有返回的话 那就默认返回eax中上次的值 00A1403  mov         eax,dword ptr [b]   000A1406  push        eax   000A1407  mov         ecx,dword ptr [a]   000A140A  push        ecx   000A140B  call        max (0A1109h)   000A1410  add         esp,8   000A1413  mov         dword ptr [c],eax

user: user-0
content: 引用 4 楼 u011779875 的回复:max都返回最小值2了啊  它返回的时候把值复制给c 之后就销毁了函数里面的变量了  打印2那是自然的 要是打出的是0 那你就见鬼了 赶紧拨打110   函数里面的 a>b不成立的啊

user: user-0
content: 恩  引用 3 楼 wangdahu888 的回复:int max(int a,int b) {     if(a>b) 如果a<b是不是就没返回值了     {         return a;     } } 编译器应该给你个“并不是所有的执行路径都有返回值”的警告吧  恩恩，，，但是    以前 我记得这样 就不会返回一个值 的

user: user-4
content: max都返回最小值2了啊  它返回的时候把值复制给c 之后就销毁了函数里面的变量了  打印2那是自然的 要是打出的是0 那你就见鬼了 赶紧拨打110

user: user-6
content: int max(int a,int b) {     if(a>b) 如果a<b是不是就没返回值了     {         return a;     } } 编译器应该给你个“并不是所有的执行路径都有返回值”的警告吧

user: user-0
content: 引用 1 楼 user-7 的回复:这个东西就是看编译器了, 这种不确定的东西, 你应该自己处理掉, 在函数结束的地方返回一个默认值. 而不是认编译器去给你指定默认返回值. 只是  在无意的时候发现的，   我想问以下，，是不是  编译器在 知道函数有返回值的时候   ，如果函数会返回一个 默认的值， 那么对于这个默认的值，是怎么确定的呢？

user: user-7
content: 这个东西就是看编译器了, 这种不确定的东西, 你应该自己处理掉, 在函数结束的地方返回一个默认值. 而不是认编译器去给你指定默认返回值.