C ++中的函数行为

时间:2014-04-01 11:31:04

标签: c++ function

我有以下代码:

int Fun(int x, int y)
{
    if(x<y)
        return 1;
}
int main ()
{

    cout<<Fun(6,2)<<endl;
}

此代码的输出为6( x 的值)!!我不知道为什么这种行为......任何人都可以向我解释。

提前致谢。

3 个答案:

答案 0 :(得分:6)

这里有Undefined behavior,就像它已经说过的那样。

正如C ++ 11标准中所述:

  

6.6.3退货声明[stmt.return]

     
      
  1. [..]流出一个函数的末尾相当于一个没有值的返回;这会导致值返回函数中出现未定义的行为。
  2.   

说明:

int Fun(int x, int y)
{
    if ( x < y ) // if this condition is false, then no return statement
        return 1;
}

如何解决这个问题?

int Fun(int x, int y)
{
    if ( x < y )
    {
        return 1;
    }
    return 0;  // <-- Fix the error
}

注意:你的编译器应该至少给你一个警告 ...你有没有忽略它? (类似&#34;并非所有控制路径都返回值&#34;

答案 1 :(得分:3)

你在Fun

结束时错过了一个return语句
int Fun(int x, int y)
{
    if(x<y)
        return 1;
    return 0;
}

你得到的6只是未定义的行为(你可以得到任何东西......甚至是核心转储)应该返回的函数但它没有返回

请注意,现有的返回1在if(x<y) ...的范围内,因为if if without braces {}将作为一个主体声明。

答案 2 :(得分:1)

你在Fun

结束时错过了一个return语句

由于6,您获得Function Prologue and Epilogue。在调用函数时,程序会将62放入堆栈,返回值将保存在eax寄存器中。根据我的知识,在比较值时,程序会将6复制到eax寄存器,因为你没有返回任何内容,eax寄存器没有得到更新。并且调用者程序从eax寄存器中读取数据6

请检查此部分,我已从您的示例生成汇编代码。

        movl    8(%ebp), %eax       //eax has value 6
        cmpl    12(%ebp), %eax
        jge     .L5                //if true (x>y) then jump to .L5
        movl    $1, %eax           //updating eax to 1 if false (x<y)
        movl    %eax, -4(%ebp)
        jmp     .L1
.L5:
        jmp     .L4
.L1:
        movl    -4(%ebp), %eax
.L4:
        leave
        ret                        //returning from function eax still have value 6 as per your code