为什么这个功能永远不会超越第一线?

时间:2018-01-11 22:51:16

标签: c++

我正在阅读Bjarne Stroustrup的书,这对我来说非常混乱(可能是因为英语不是我的第一语言)。这本书说表达式()永远不会超越第一行代码。 expression()从调用本身开始的事实是否导致expression()无限地调用自身?这是如何运作的? 感谢。

double expression()
{
    double left = expression();
    Token t = get_token();
    swich(t.kind) {
        case'+':
            return left + term();
        case'-':
            return left - term();
        default:
            return left;
    }
}

2 个答案:

答案 0 :(得分:1)

基本上这是一个无限循环,请阅读https://en.wikipedia.org/wiki/Recursion_(computer_science) https://en.wikipedia.org/wiki/Infinite_loop

double expression()
{
    double left = expression(); // <-- Each time the program reaches this line, it calls expression() again.
    (...)
}

答案 1 :(得分:1)

理解递归函数调用首先需要理解函数调用。请参阅以下简短示例:

void print() {
   std::cout << "Hello! ";
}

int main() {
   print();
   print();
}

输出为Hello! Hello!,因为函数main调用函数print两次,程序将结束。

现在考虑如果函数print包含调用print()会发生什么,即如果它调用“本身”:

void print() {
   std::cout << "Hello! ";
   print();
}

然后,输出将是(几乎)无穷无尽的Hello! Hello! Hello!...序列,因为 - 在打印出一个Hello!之后,函数print会自行调用,并且一次又一次地发生相同的过程。 / p>

希望它有所帮助。而BTW:你可能会从一本不同的书开始: - )