2

下面的代码打印:

5

为什么要打印 5?此外,如果它返回 5,为什么它不打印“James”?我不明白下面的代码。如果我删除 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;
}
4

5 回答 5

18

您遇到了未定义的行为。你的功能实际上什么都没有return!查看每个条件:

  • c>10? 是的。
  • a<b && a >0? 不。
  • b<0? 不。

因此,您永远不会碰到任何returns。这意味着您的程序中绝对可能发生任何事情。在您的情况下,似乎恰好发生了5存储在程序return期望值的位置的情况。

于 2013-11-01T23:35:23.483 回答
5

所以前两行 fonk delcare 以下值:

int a = 5, b = 3, c = a *b;

5、3a和15b也是如此c

if(c >10)

15 大于 10。

    if( a<b && a >0)

这不是真的,所以 James/return 一个分支没有被执行。

    else if(b<0)

b 为 3,即 >= 0,因此不执行 return b 语句。

else

此语句引用“c > 10”,c > 10 为真,因此不执行此 else 子句。

}

你的函数没有返回任何东西就结束了,这会调用“未定义的行为”。

解决方案:从中删除“else”else return -1;或添加 areturn -2;以查看您的代码不遵循任何路径的情况。

我看到您正在使用 GCC - 添加“-Wall”选项以从编译器获得最大的诊断,它应该告诉您您的函数有一个不返回值的代码路径。

于 2013-11-01T23:36:14.170 回答
3

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

你不能依赖它,因为它是 C++ 标准第 6.6.3 节中未定义的行为(如果我的谷歌技能对我有用的话)。

于 2013-11-01T23:35:00.107 回答
2

这是本网站的题外话,但让我们通过每一行

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 在比较期间存储值

于 2013-11-01T23:36:21.753 回答
0

如果退出int没有返回值的函数return,则结果未定义。不是默认值。

编译器可以打印 5,可以打印 0,coukd 打印 4232732,或者它可以格式化你的硬盘。所有 woukd 都是您程序的合法 C++ 结果。

处理这个问题的方法有两个:打开警告和作为错误的警告,因为对于并非所有控制路径都返回值肯定存在警告。

其次,不要创建并非所有控制路径都返回值的函数。

于 2013-11-01T23:39:17.857 回答