#include<stdio.h>
int Bye(int n);
void main()
{
int n = 10;
printf("%d", Bye(n));
}
int Bye(int m)
{
if (m > 0) {return (m+Bye(m-2));}
}
此处,此代码在代码块或任何其他 C 编译器上运行时输出 30。 根据我的预期,代码不应该给出任何输出,但它给出了 30 的输出。
原因是每次迭代后“m”的值都会减少 2,直到 m = 0 时,编译器应该忽略“if”块内的任何语句,因为(m > 0)。因此,当编译器跳过“if”语句内的代码块时,整个“return”函数也会被跳过,这意味着“Bye”函数将没有返回,这意味着没有输出或某种错误。 简而言之:-
这应该发生: 10+8+6+4+2+0 => (m>0) => 跳过返回函数 => 无返回 => 无输出/错误
但是,这种情况发生了: 10+8+6+4+2+0 =>(输出 = 30)
请解释为什么会发生这种情况。
您的
Bye
函数不会在所有分支中返回。
int Bye(int m) { if (m > 0) {return (m+Bye(m-2));} }
最终递归将导致
Bye
传递一个不大于0
的值,然后将调用未定义的行为。 Bye
函数的返回值将是不确定的。看起来如果 m
小于 0
,您想返回 0
。如果是这样,您应该明确说明。
int Bye(int m)
{
if (m > 0) {
return (m + Bye(m-2));
}
else {
return 0;
}
}
确保编译时出现所有警告。
风格注释:
void main() { ... }
是合法的,但在现代C中更喜欢int main(void) { ... }
。