为什么以下两个段的输出不同?

时间:2018-06-06 02:29:36

标签: c recursion

10 20
30 40
50 60

输出:4 3 2 1

#include <stdio.h>
int main()
{
    static int i = 5;   // here
    if (--i){
        printf("%d ", i);
        main();
    }
}

输出:4 4 4 4 ...(分段故障)

任何想法如何只考虑一次静态int变量并反复使用int?

2 个答案:

答案 0 :(得分:0)

在函数内部声明为 let arr3: [Any] = [true, 1.2, "hello", 7] print(arr3.indexedDictionary) 的变量在每次调用函数时都会保留其值。首次调用函数时,它只初始化一次。因此,当函数调用自身时,[2: "hello", 0: true, 1: 1.2, 3: 7] 的值将保留在先前的调用中。

not knn = KNeighborsClassifier(n_neighbors=5) knn.fit(X_train, y_train) y_pred = knn.predict(X_test) print(confusion_matrix(y_test, y_pred)) print(classification_report(y_test, y_pred)) 的局部变量特定于函数的给定调用,因此每次调用该函数时,都会创建并初始化该变量的新副本。这导致每次static为5,这反过来导致无限递归,导致堆栈溢出和核心转储。

答案 1 :(得分:0)

当您在函数中声明static变量时,函数&#34;会记住&#34;变量的最后一个值,即使它终止后也是如此。

void Foo() {
    static int x = 5;
}

在上面的示例中,您告诉编译器x将被记住&#34;&#34;并且初始值为5。对Foo()的后续调用不会将x的值5重新分配,而是使用之前记住的值。

相反:

void Bar() {
    int x = 5;
}

在这里,您告诉编译器每次Bar()执行时,都会在堆栈上创建一个新变量x并赋值为5