我有以下代码:
int Fun(int x, int y)
{
if(x<y)
return 1;
}
int main ()
{
cout<<Fun(6,2)<<endl;
}
此代码的输出为6( x 的值)!!我不知道为什么这种行为......任何人都可以向我解释。
提前致谢。
答案 0 :(得分:6)
这里有Undefined behavior,就像它已经说过的那样。
正如C ++ 11标准中所述:
6.6.3退货声明[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
}
注意:你的编译器应该至少给你一个警告 ...你有没有忽略它? (类似&#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
。在调用函数时,程序会将6
和2
放入堆栈,返回值将保存在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