未获得简单 C 程序的预期输出

问题描述 投票:0回答:1
#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)

请解释为什么会发生这种情况。

c if-statement recursion iteration return-value
1个回答
1
投票

您的

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) { ... }

© www.soinside.com 2019 - 2024. All rights reserved.