函数的默认返回值1,返回类型为int?

hpo*_*762 -4 c c++

在这个特定的代码中,我无法看到它是如何输出的1.控件到达函数返回int类型的末尾而不会遇到return语句,因此不应该有运行时错误.我尝试将其他一些值传递给函数,所有都打印相同的值,1因为b之前结果是奇数0.

我试着搜索int返回函数的默认返回值,但无法得到满意的答案.有人说,默认的返回值是0,那么为什么1是这里的输出?

int fun(int a, int b) {
    if (b == 0) {
        return 0;
    }
    if (b % 2 == 0) {
        return fun(a + a, b / 2);
    }
}

int main() {
    printf("%d", fun(6, 3));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

gez*_*eza 8

未返回返回类型的函数的值是未定义的行为void(除了main- main返回0).未定义的行为意味着任何事情都会发生.

你为什么得到1?在x86上,返回一个函数,返回intregister的值eax.因此,如果未在函数中返回值,则函数将eax在exit处返回包含的任何值.

这里是一个可能的解释:在b%2,编译器把b进入eax,并and与1的IT的结果and可以是01,eax将包含这些值之一.如果结果是1,则fun退出而不返回.所以,在退出时,eax包含1.这是从函数返回的值.

注意:如果启用警告,编译器将发出警告.

注2:一些编译器在这里放置运行时错误,正如您所期望的那样(例如,clang执行此操作).

注3:某些编译器为此发出编译错误(例如MSVC).

  • @ hpotter97762:它给出了一个看似合理的解释,但只检查汇编代码会确认解释是否正确.无论如何,任何行为都可能无关紧要,包括计算机崩溃或熔断保险丝. (2认同)

Nat*_*ica 5

在C++中,从应该返回值而不返回值的函数的末尾掉下来是未定义的行为.您可能得到0,可能得到1,或者可以存储在返回类型中的任何其他值.

这是不正确的唯一一次是main.标准中有一个条款,如果没有一个条款,则强制要求main隐含return 0;.