C++ 使用带返回和不带返回的递归来反转数字

C++ 使用带返回和不带返回的递归来反转数字,c++,recursion,C++,Recursion,为什么以下代码在主函数中打印0,而在递归函数调用中没有返回语句: #include <iostream> using namespace std; int reverse(int num, int rev = 0) { if(num == 0) return rev; reverse(num / 10, rev * 10 + (num % 10)); } int main() { cout << reverse(123);

为什么以下代码在主函数中打印0,而在递归函数调用中没有返回语句:

#include <iostream>
using namespace std;

int reverse(int num, int rev = 0)
{
    if(num == 0)
        return rev;
    reverse(num / 10, rev * 10 + (num % 10));
}
int main()
{
    cout << reverse(123);
    return 0;
}
但在返回语句中:

#include <iostream>
using namespace std;

int reverse(int num, int rev = 0)
{
    if(num == 0)
        return rev;
    return reverse(num / 10, rev * 10 + (num % 10));
}
int main()
{
    cout << reverse(123);
    return 0;
}

它打印321。在返回到main函数之前,我使用了GDB,在这两种情况下rev的值都是321,那么为什么会有这种差异呢?

让我们想象一下这段代码的执行情况

包括 使用名称空间std; int reverseint num,int rev=0 { ifnum==0 返回版本; 反向枚举/10,版本*10+num%10; } int main {
cout在较低级别,程序可以访问少量命名内存位置,称为寄存器。在汇编中,有一个名为%rax的特殊寄存器,用于存储函数的返回值。因此,如果要将名为foox的函数的结果存储在变量a中,可以执行以下操作 a=foox

至于在返回到主函数之前rev为321的原因,有可能正确的返回值确实存储在%rax中,但由于您没有显式返回它,当您返回到主函数时,程序会用值0覆盖%rax。如果您想了解更多信息,可能会有一些有用的信息谢谢你


但是,正如另一个答案所提到的,在返回main之前rev为321这一事实是未定义的行为,不应被视为该语言的属性。

未定义的行为。如果您将函数声明为返回int,则它必须在所有执行分支中返回int。打开编译器警告以帮助捕获此类问题递归函数与非递归函数完全一样。考虑num=0和反向调用其他函数时会发生什么。在你的情况下它会返回什么?
reverse(123, 0) ⟶ reverse(12, 3) ⟶ reverse(1, 32) ⟶ reverse(0, 321)