none
有返回值的函数没有写返回语句,返回值应该是什么? RRS feed

  • 问题

  • 您好!
    我最近碰到这个问题,声明一个函数,有返回值,可是没有返回语句,如下:
    string getstring(string s,int index)
    {
        if(index==1)
           return "1234";
    }
    这样写只会有警告信息。
    在我测试的时候,如果index不等于1,返回值等于s,不知道是怎么得到的?请帮忙,谢谢!
    另外类的成员函数如果这样写好像也是这样。
    How can I to disactive when wpf window start?
    2009年4月2日 8:44

答案

  • 按照你的代码,运行后如果index不是1程序就崩溃了,没有出现你说的结果啊?
    欢迎光临我的个人网站:http://www.joyvc.cn,本网站提供[IM即时通信|棋牌游戏|网游开发|UI编程|网络通讯|组件开发|图像多媒体|数据库]方面的VC/C++/C技术文章、源代码和教程资料
    2009年4月2日 9:18
    版主
  • 用char * 程序一样崩溃

    你是用的什么编译器?

    char * getstring(char * s,int index)
    {
     if(index==1)
      return "1234";
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
     printf_s(getstring("Made in China", 0));
     return 0;
    }

    OD 调试:
    push    ebp
    mov     ebp, esp
    sub     esp, 0C0
    push    ebx
    push    esi
    push    edi
    lea     edi, dword ptr [ebp-C0]
    mov     ecx, 30
    mov     eax, CCCCCCCC   // eax = CCCCCCCC
    rep     stos dword ptr es:[edi]
    cmp     dword ptr [ebp+C], 1
    jnz     short 008713D9   // 跳转已实现
    mov     eax, 0087573C                    ; ASCII "1234" // 因为index不等于1所以这里不会执行

    pop     edi
    pop     esi
    pop     ebx
    mov     esp, ebp
    pop     ebp
    retn     // eax做为返回值,所以怎么可能会返回char * s?

    除非把mov     eax, CCCCCCCC 改成NOP,才会出现你说的结果返回char * s
    是不是你编译器太另类? 呵

     

    2009年4月2日 18:14

全部回复

  • 按照你的代码,运行后如果index不是1程序就崩溃了,没有出现你说的结果啊?
    欢迎光临我的个人网站:http://www.joyvc.cn,本网站提供[IM即时通信|棋牌游戏|网游开发|UI编程|网络通讯|组件开发|图像多媒体|数据库]方面的VC/C++/C技术文章、源代码和教程资料
    2009年4月2日 9:18
    版主
  • 呵呵,用char*替代string,再试一下,我试过几次了
    How can I to disactive when wpf window start?
    2009年4月2日 9:20
  • 用char * 程序一样崩溃

    你是用的什么编译器?

    char * getstring(char * s,int index)
    {
     if(index==1)
      return "1234";
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
     printf_s(getstring("Made in China", 0));
     return 0;
    }

    OD 调试:
    push    ebp
    mov     ebp, esp
    sub     esp, 0C0
    push    ebx
    push    esi
    push    edi
    lea     edi, dword ptr [ebp-C0]
    mov     ecx, 30
    mov     eax, CCCCCCCC   // eax = CCCCCCCC
    rep     stos dword ptr es:[edi]
    cmp     dword ptr [ebp+C], 1
    jnz     short 008713D9   // 跳转已实现
    mov     eax, 0087573C                    ; ASCII "1234" // 因为index不等于1所以这里不会执行

    pop     edi
    pop     esi
    pop     ebx
    mov     esp, ebp
    pop     ebp
    retn     // eax做为返回值,所以怎么可能会返回char * s?

    除非把mov     eax, CCCCCCCC 改成NOP,才会出现你说的结果返回char * s
    是不是你编译器太另类? 呵

     

    2009年4月2日 18:14
  • 在release中,处于优化的原因,不会重置寄存器。
    根据函数返回值从eax寄存器中取,如果没有调用返回值,那么也就是没有向eax中重新赋值。返回值为eax中的原始值。
    比如你的调用顺序是:
    getstring("Its me",1);
    string s = getstring("Me too",0);
    这是s会是"Its me."
    那么在debug中则会返回未定义数值。

    2009年4月3日 1:37
    版主