C++递归过程中出现的问题

    技术2022-09-01  88

    C++递归过程中出现的问题

    文章目录

    C++递归过程中出现的问题提出问题发现问题:作出假设解决方法总结

    提出问题

    一个蛮有意思的问题,朋友问我的。 先看遇到问题的代码

    #include<iostream> using namespace std; int a[5] = {1,2,3,4,5}; int f(int i){ if(i < 5) return a[i]+f(i+1); } int main(){ cout << f(0) << endl; return 0; }

    很明显这里的 f( ) 有问题,因为 i == 5的时候没有返回值

    如果是clang这里会直接报错。

    gcc编译会因为<iostream>报错

    /tmp/ccv3ma76.o:在函数‘main’中: a.cpp:(.text+0x47):对‘std::cout’未定义的引用 a.cpp:(.text+0x4c):对‘std::ostream::operator<<(int)’未定义的引用 a.cpp:(.text+0x51):对‘std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)’未定义的引用 a.cpp:(.text+0x59):对‘std::ostream::operator<<(std::ostream& (*)(std::ostream&))’未定义的引用 /tmp/ccv3ma76.o:在函数‘__static_initialization_and_destruction_0(int, int)’中: a.cpp:(.text+0x87):对‘std::ios_base::Init::Init()’未定义的引用 a.cpp:(.text+0x96):对‘std::ios_base::Init::~Init()’未定义的引用

    注释掉相关代码以后还是会报错,也就是说只要include这个头文件就会报错

    /tmp/ccs8zhVg.o:在函数‘__static_initialization_and_destruction_0(int, int)’中: a.cpp:(.text+0x7f):对‘std::ios_base::Init::Init()’未定义的引用 a.cpp:(.text+0x8e):对‘std::ios_base::Init::~Init()’未定义的引用

    删除iostream以后,改用cstdio的printf可以正常编译 找到报错原因了,主要是因为gcc不会自动链接STL标准库,加上参数-lstdc++可以正常编译,详细解释可以看这篇博客。

    g++可以直接成功编译,没有任何问题。

    在gcc和g++编译以后都可以运行。

    发现问题:

    运行结果是20,而不是15。

    作出假设

    可能是dev自己给f最后加了一句话 return i; dev坏了( @ _ @ )

    解决方法

    先查看相关的的汇编码:

    _Z1fi: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 pushq %rbx subq $24, %rsp .cfi_offset 3, -24 movl
    转载请注明原文地址:https://ipadbbs.8miu.com/read-36231.html
    最新回复(0)