2014-04-01 27 views
1

我有以下代码:功能行为在C++

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

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

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

在此先感谢。

+0

您正在使用哪种编译器和IDE? –

+0

这段代码应该给你警告。 – Abhineet

+0

这是[*未定义行为*](http://en.wikipedia.org/wiki/Undefined_behavior)。如果你的if语句中的条件是错误的呢?那么会返回什么? –

回答

3

你在玩转月底缺少return语句

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

你得到的6只是不确定的行为(你能得到什么......甚至一个核心转储)的函数应返回,但它没有返回

请注意,现有的返回1在if(x<y)的范围内...因为如果没有大括号{},它将以一个语句作为主体。

6

在这里你有一个Undefined behavior就像它已经说过。

正如在C++ 11标准指出:

6.6.3 return语句[stmt.return]

  • [。 。]从函数末尾流出相当于没有值的返回;这会导致值返回函数中的未定义行为。
  • 说明:

    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 
    } 
    

    注:编译器应该给你一个警告至少...你忽略它?在乐趣

    结束

    你得到,因为Function Prologue and Epilogue6(像“不是所有的控制路径返回一个值”

    1

    你缺少一个return语句。在调用该函数时,程序会将62放入堆栈,并将返回值保存在eax寄存器中。所以根据我的知识,而比较值程序将复制6eax注册表,因为你没有返回任何东西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