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

Not getting expected output of a simple C program

提问人:ArghyaGh 提问时间:10/12/2023 最后编辑:ChrisArghyaGh 更新时间:10/14/2023 访问量:59

问:

#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 语句 递归 迭代 return-value

评论

5赞 Eugene Sh. 10/12/2023
“跳过”返回正在产生未定义的行为。添加一个子句以返回定义的值,以防万一elsem<=0
0赞 Some programmer dude 10/12/2023
如果为 false,那么您的函数返回什么?您已经告诉编译器该函数应返回一个值,这意味着您必须返回一个值。没有“可选”返回值或默认返回值。m > 0intint
0赞 Some programmer dude 10/12/2023
所需返回的唯一例外是来自 main 函数......首先必须声明返回,其他任何内容都是无效的。但这是唯一不需要明确声明的功能。如果缺少一个,则编译器将假定它将返回 。intreturn0
2赞 Gerhardh 10/12/2023
除了未定义的行为之外,您还期望发生什么?这里应该添加什么:如果小于 0?您增加了一些值,但没有提供该值。对随机值求和。除此之外,你的编译器应该告诉你不要从非 void 函数返回值。不要忽略编译器消息。他们是为了帮助你。mm+Bye(m-2));m-2
1赞 Tom Karzes 10/12/2023
如果你的函数“跳过”了 return 语句,那只是意味着它返回时没有任何特定的返回值。调用方将拾取返回值寄存器(或放置返回值的任何位置)中的任何值。结果是未定义的。这是一个严重的错误。所以,修复它。添加带有返回值的显式语句。您应该已经收到有关此错误的编译时警告。不要忽视这些警告。修复它们。Byereturn

答:

1赞 Chris 10/12/2023 #1

您的函数不会在所有分支中返回。Bye

int Bye(int m)
{
    if (m > 0) {return (m+Bye(m-2));}
}

最终,递归将导致传递一个不大于 的值,然后将调用未定义的行为。函数的返回值是不确定的。看起来在少于您想要返回的情况下.如果是这样,你应该尽可能明确地说明。Bye0Byem00

int Bye(int m)
{
    if (m > 0) {
        return (m + Bye(m-2));
    }
    else {
        return 0;
    }
}

确保在编译时打开所有警告。

样式说明:可能适用于您的编译器,但更喜欢现代 C。void main() { ... }int main(void) { ... }

评论

0赞 Chris 11/10/2023
如果你觉得答案对你的问题是一个很好的答案,你可以在 Stack Overflow 上通过将答案标记为已接受来表示感谢。