没有得到简单C程序的预期输出

wgmfuz8q  于 2023-10-15  发布在  其他
关注(0)|答案(1)|浏览(123)
#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)
请解释为什么会发生这种情况。

gr8qqesn

gr8qqesn1#

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

相关问题