以下代码打印:
5
为什么打印5?如果它返回5为什么它不打印“詹姆斯”?我不明白下面的代码。如果我删除了else字,则打印-1。但是它不应该返回默认值吗?
#include <iostream>
#include <sstream>
#include <string>
using namespace std;
int fonk()
{
int a = 5, b = 3;
int c = a*b;
if(c >10)
{
if( a<b && a >0)
{ cout <<"James";
return a;
}
else if(b<0)
{
return b;
}
}
else return -1;
}
int main()
{
int x = fonk();
cout << x;
}
答案 0 :(得分:17)
您正在点击未定义的行为。你的功能实际上没有return
任何东西!看看每个条件:
c>10
?是a<b && a >0
?号b<0
?号所以你永远不会碰到任何return
。这意味着你的程序中绝对会发生任何事情。在您的情况下,似乎恰好存在5
存储在程序期望return
值的位置。
答案 1 :(得分:5)
所以前两行的fonk delcare有以下几个值:
int a = 5, b = 3, c = a *b;
因此a
为5,b
为3,c
为15。
if(c >10)
15大于10.
if( a<b && a >0)
这不是真的,所以James / return分支没有被执行。
else if(b<0)
b为3,即> = 0,因此不执行return b语句。
else
此声明涉及&#34; c&gt; 10&#34;,c> 10是真的,所以这个else子句没有被执行。
}
你的函数在没有返回任何内容的情况下结束,这会调用&#34; Undefined Behavior&#34;。
解决方案:删除“其他”&#39;来自else return -1;
或添加return -2;
,以查看您的代码未遵循任何路径的情况。
我看到您正在使用GCC - 添加&#39; -Wall&#39;从编译器获取最大诊断的选项,它应该告诉您,您的函数有一个不返回值的代码路径。
答案 2 :(得分:3)
你不能依赖它,因为它是未定义的行为,根据C ++标准第6.6.3节(如果我的谷歌技能为我服务)。
答案 3 :(得分:2)
这是该网站的offtopic,但让我们通过每一行
int a=5, b =3;
int c = a*b;
c现在是15岁
if(c >10) // 15>10 - true
{
if( (a<b) && (a>0) ) // 5<3 - false, so we go further
{
cout <<"James";
return a;
}
else if(b<0) // 3<0 - false, we go further
{
return b;
}
// here is error, should be another one return
}
else
return -1; // this will not be executed, as it is else for if (c>10)
更新:为什么它返回5 - 通常将函数的返回值放入(e)ax寄存器(我假设您在x86平台上),因此您的编译器在比较期间使用ax存储a的值
答案 4 :(得分:0)
如果退出的函数返回int
而没有return
值,则结果是未定义的。不是默认值。
编译器可以打印5,可以打印0,coukd打印4232732,或者它可以格式化您的硬盘。所有woukd都是您程序的合法C ++结果。
处理此问题的方法有两个方面:将警告和警告设置为错误,因为肯定有一个wsrning并非所有控制路径都返回一个值。
其次,不要使所有控制路径都没有返回值的函数。