#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”函数将没有return,这意味着没有输出或某种错误。简而言之:
这是应该发生的事情:10+8+6+4+2+0 =>(m>0)=>跳过返回函数=>无返回=>无输出/错误
但结果却是这样10+8+6+4+2+0 =>(输出= 30)
请解释为什么会发生这种情况。
1条答案
按热度按时间gr8qqesn1#
您的
Bye
函数不会在所有分支中返回。最终,递归将导致
Bye
传递一个不大于0
的值,然后将调用未定义的行为。Bye
函数的返回值将是不确定的。如果m
小于0
,则返回0
。如果是这样,你应该明确地说出来。确保在编译时打开所有警告。
风格说明:
void main() { ... }
可能与您的编译器一起使用,但更喜欢现代C中的int main(void) { ... }
。