在这个特定的代码中,我无法看到它是如何输出的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)
未返回返回类型的函数的值是未定义的行为void(除了main- main返回0).未定义的行为意味着任何事情都会发生.
你为什么得到1?在x86上,返回一个函数,返回intregister的值eax.因此,如果未在函数中返回值,则函数将eax在exit处返回包含的任何值.
这里是一个可能的解释:在b%2,编译器把b进入eax,并and与1的IT的结果and可以是0或1,eax将包含这些值之一.如果结果是1,则fun退出而不返回.所以,在退出时,eax包含1.这是从函数返回的值.
注意:如果启用警告,编译器将发出警告.
注2:一些编译器在这里放置运行时错误,正如您所期望的那样(例如,clang执行此操作).
注3:某些编译器为此发出编译错误(例如MSVC).
在C++中,从应该返回值而不返回值的函数的末尾掉下来是未定义的行为.您可能得到0,可能得到1,或者可以存储在返回类型中的任何其他值.
这是不正确的唯一一次是main.标准中有一个条款,如果没有一个条款,则强制要求main隐含return 0;.