为什么我的函数不断出现错误?

时间:2020-07-29 16:55:51

标签: c cs50 collatz

#include <stdio.h>
#include <cs50.h>

int collatz(int n);
int main(void)
{
    int x = get_int("number: ");
    collatz(x);
    printf("%d", collatz(x));
}

int collatz(int n)
{
    if (n == 1)
        return 0;
    else if ((n % 2) == 0)
        return 1 + collatz(n/2);
    else if ((n % 2) == 1)
        return 1 + collatz((n*3) + 1);
}

运行此代码时,我不断收到错误消息

collatz.c:20:1: error: control may reach end of non-void function
      [-Werror,-Wreturn-type]
}

如果我将功能更改为void,则会收到错误消息

collatz.c:15:9: error: void function 'collatz' should not return a value
      [-Wreturn-type]
        return 0;

我做错了什么吗? collat​​z函数返回一个值,但该函数在void和int两种情况下均无法正确编译。

3 个答案:

答案 0 :(得分:7)

只需添加一个额外的分支即可使编译器满意:

int collatz(int n)
{
if (n == 1)
    return 0;
else if ((n % 2) == 0)
    return 1 + collatz(n/2);
else if ((n % 2) == 1)
    return 1 + collatz((n*3) + 1);
else
    return -1; // this happen if called with odd negative n.
}

答案 1 :(得分:1)

重写collatz,以便编译器可以看到它不退出return语句就不会退出:

int collatz(int n)
{
    if (n == 1)
        return 0;

    if ((n % 2) == 0)
        return 1 + collatz(n/2);

    return 1 + collatz((n*3) + 1);
}

答案 2 :(得分:0)

警告消息清楚地解释了为什么编译器将其抛出。

error: control may reach end of non-void function

这意味着不能保证函数将返回某些内容。您函数的返回类型为int,因此它需要返回一个int。您的if-else条件不是穷尽的(考虑负数),因此控制流可能会到达函数的末尾而不返回任何内容。

如果我将功能更改为void,则会收到错误消息

collatz.c:15:9: error: void function 'collatz' should not return a value
  [-Wreturn-type]
    return 0;

如果将函数返回类型更改为void,则不能从中返回int。因此,此消息。

正如其他人已经建议的那样,您需要以一种编译器肯定会命中某些return语句的方式来重写函数。

Also Weather Vane指出了代码中一些更严重的错误。请注意它们。