If-else语句中的返回值 - C ++

时间:2013-11-01 23:31:46

标签: c++ if-statement return-value

以下代码打印:

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;
}

5 个答案:

答案 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)

不,你有点错误。你的最后一个属于第一个if语句,所以永远不会被调用。您的函数恰好返回5,因为恰好位于编译器通常放置返回值的位置。

你不能依赖它,因为它是未定义的行为,根据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并非所有控制路径都返回一个值。

其次,不要使所有控制路径都没有返回值的函数。