#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;
我做错了什么吗? collatz函数返回一个值,但该函数在void和int两种情况下均无法正确编译。
答案 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指出了代码中一些更严重的错误。请注意它们。