我有以下代码:功能行为在C++
int Fun(int x, int y)
{
if(x<y)
return 1;
}
int main()
{
cout<<Fun(6,2)<<endl;
}
此代码的输出是图6(的X的值)!!我不知道为什么这种行为......任何人都可以向我解释。
在此先感谢。
我有以下代码:功能行为在C++
int Fun(int x, int y)
{
if(x<y)
return 1;
}
int main()
{
cout<<Fun(6,2)<<endl;
}
此代码的输出是图6(的X的值)!!我不知道为什么这种行为......任何人都可以向我解释。
在此先感谢。
你在玩转月底缺少return语句
int Fun(int x, int y)
{
if(x<y)
return 1;
return 0;
}
你得到的6只是不确定的行为(你能得到什么......甚至一个核心转储)的函数应返回,但它没有返回
请注意,现有的返回1在if(x<y)
的范围内...因为如果没有大括号{},它将以一个语句作为主体。
在这里你有一个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 Epilogue
的6
(像“不是所有的控制路径返回一个值”)
你缺少一个return语句。在调用该函数时,程序会将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
您正在使用哪种编译器和IDE? –
这段代码应该给你警告。 – Abhineet
这是[*未定义行为*](http://en.wikipedia.org/wiki/Undefined_behavior)。如果你的if语句中的条件是错误的呢?那么会返回什么? –