C函数return的正确结果却没有给出return语句,为什么?
C function returns correct result but no return statement is given, why?
所以我写了一个函数,应该 return 第 n 个斐波那契数,但实际上我忘了 return 我的结果。我确实收到了“控件到达非空函数的末尾”警告,但代码执行正常并且 returned 得到了正确的结果。这是为什么? C怎么知道它应该 return "result"?
int fib (int n);
int main(int argc, char** argv) {
printf("%d", fib(10));
}
int fib (int n){
if (n == 1){
return 1;
}
if (n == 0){
return 0
}
fib(n-2) + fib(n-1)
}
它return编辑了这个
55
我尝试添加
int j = n+1
到函数的最后一行,然后它实际上 returned 2,而不是 256。这是一个错误,还是 c 是如何读取这样的内容的?
在没有 return
语句的情况下到达非 void
函数的末尾会调用未定义的行为。获得预期结果是一种未定义行为,通常称为 运气 。顺便说一下,256
可能是你所期望的,但它不是 正确的。
一个可能的解释是:由函数计算并存储到通常包含 return 值的寄存器中的最后一个值是预期结果。
当然你永远不应该依赖它,也不应该期待它。
这是使用编译器警告的一个很好的例子:不要忽略它们。始终打开更多编译器警告并修复代码。 gcc -Wall -W
或 clang -Weverything
可以发现许多愚蠢的错误并节省调试时间。
还有一些其他问题:
- 你不包括
<stdio.h>
- 你计算了一个
unsigned long long
但只有 return 一个可能更小的类型 int
- 您的算法计算 2 的幂,而不是斐波那契数。
所以我写了一个函数,应该 return 第 n 个斐波那契数,但实际上我忘了 return 我的结果。我确实收到了“控件到达非空函数的末尾”警告,但代码执行正常并且 returned 得到了正确的结果。这是为什么? C怎么知道它应该 return "result"?
int fib (int n);
int main(int argc, char** argv) {
printf("%d", fib(10));
}
int fib (int n){
if (n == 1){
return 1;
}
if (n == 0){
return 0
}
fib(n-2) + fib(n-1)
}
它return编辑了这个
55
我尝试添加
int j = n+1
到函数的最后一行,然后它实际上 returned 2,而不是 256。这是一个错误,还是 c 是如何读取这样的内容的?
在没有 return
语句的情况下到达非 void
函数的末尾会调用未定义的行为。获得预期结果是一种未定义行为,通常称为 运气 。顺便说一下,256
可能是你所期望的,但它不是 正确的。
一个可能的解释是:由函数计算并存储到通常包含 return 值的寄存器中的最后一个值是预期结果。
当然你永远不应该依赖它,也不应该期待它。
这是使用编译器警告的一个很好的例子:不要忽略它们。始终打开更多编译器警告并修复代码。 gcc -Wall -W
或 clang -Weverything
可以发现许多愚蠢的错误并节省调试时间。
还有一些其他问题:
- 你不包括
<stdio.h>
- 你计算了一个
unsigned long long
但只有 return 一个可能更小的类型int
- 您的算法计算 2 的幂,而不是斐波那契数。