-1

所以我在其他程序中没有得到这个错误,但我确实得到了它。

这个程序是一个我没有得到错误的例子。

#include<stdio.h>

int main() {



    system("pause");
} // end main

但在下面的这个程序中我得到了错误

#include <stdio.h>
//#include <stdlib.h>

// Takes the number from function1, calculates the result and returns recursively.
int topla (int n) {
    if(n == 1)
    return 3;
    else
        return topla(n-1) + topla(n-1) + topla(n-1);
}

// Takes a number from main and calls function topla to find out what is 3 to the
// power of n 
int function1(int n) {
    return topla(n);
}

int main() {
    int n; // We us this to calculate 3 to the power of n

    printf("Enter a number n to find what 3 to the power n is: ");
    scanf("%d", &n);
    function1(n);

    system("pause");
} // end main
4

3 回答 3

2

只需 include stdlib.h,但不要使用system("pause"),因为它不是标准的,并且不适用于每个系统,只需一个简单的getchar()(或因为你使用过的循环涉及getchar()scanf())就可以解决问题。

并且通常system("pause")在 windows 命令行程序中找到,因为 windows 命令提示符在程序退出时关闭,所以直接从命令提示符运行程序可能会有所帮助,或者使用像geany这样修复此问题的 IDE 。

最后总是检查返回值,scanf()而不是假设它有效。

注意:此代码

return topla(n - 1) + topla(n - 1) + topla(n - 1)

你可以写成

return 3 * topla(n - 1);

而不是topla()递归调用3次。

而且你并不真正需要,else因为函数返回,除非n != 1即使没有else递归,当n == 1.

于 2016-01-03T19:10:22.600 回答
2

system函数在标准头文件中声明<stdlib.h>。如果你的程序调用system(),你必须

#include <stdlib.h>

在源文件的顶部或附近。

但是你的部分问题是:为什么当你省略#include指令时编译器没有抱怨?

1990 C 标准(有时称为“ANSI C”)允许调用未明确声明的函数。如果你写,例如:

system("pause");

如果函数没有可见的声明system,则假定它system的返回类型为int且参数与调用中的参数匹配——在本例中,为一个类型为 的参数char*。这恰好与 的实际声明一致system,因此使用 C90 编译器,您可以省略该#include指令。为了向后兼容,一些支持最新的 1999 和 2011 标准(不允许隐式声明)的 C 编译器仍然允许旧形式,可能带有警告。

即使给定一个 C90 编译器,依赖现在已过时的“隐式int”规则也没有任何好处。只需添加#include <stdlib.h>. 更一般地说,对于您调用的任何库函数,请阅读其文档和#include声明它的标头。

至于为什么你的一个程序出错而不是另一个程序出错,我对此没有任何解释。也许您使用不同的设置调用了编译器。无论如何,这并不重要——尽管你可能会研究如何配置你的编译器,所以它总是会警告这样的事情,这样你就可以避免这种错误。

于 2016-01-03T21:12:37.123 回答
1

在这里,您需要了解两件事。

首先,您的代码运行良好,程序确实找到了 3^n 的值。所以不用担心。

来到 system() 部分,

为了使用该system();函数,您需要包含 stdlib.h 头文件,因为该函数是在该头文件中声明的。

因此,包含标题(而不是对其进行评论)是一种很好的做法。

现在,在 windows 中使用了 pause 关键字,用于在程序完成后停止控制台关闭,并且仅适用于 windows。

请注意,system("pause");它也不是标准,它不适用于其他机器,即linux,因为使用系统命令,您是直接与命令行交互。在这方面,每个操作系统的命令都是特定的,不能用于其他操作系统。

因此,最好使用getchar();C 标准库函数来保存控制台窗口。

于 2016-01-03T19:43:58.143 回答