所以我没有在其他程序中得到这个错误,但我确实得到了它。
这个程序就是我没有收到错误的例子。
#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
答案 0 :(得分:2)
只需添加stdlib.h
,但不要使用system("pause")
,因为它不是标准的,并且不适用于每个系统,只是一个简单的getchar()
(或涉及{的循环{1}}因为您已经使用过getchar()
)应该这样做。
通常scanf()
在Windows命令行程序中找到,因为Windows命令提示符在程序退出时关闭,因此可能直接从命令提示符运行程序会有所帮助,或者使用修复此命令的IDE,如 geany
最后总是检查system("pause")
的返回值,而不是假设它有效。
注意:此代码
scanf()
你可以写成
return topla(n - 1) + topla(n - 1) + topla(n - 1)
而不是递归调用return 3 * topla(n - 1);
3次。
并且你真的不需要topla()
因为函数会返回,除非else
所以即使没有n != 1
递归也会在else
时停止。
答案 1 :(得分:2)
system
函数在标准标题<stdlib.h>
中声明。如果您的程序调用{{1}},则必须
system()
在源文件顶部或附近。
但你的部分问题是:当你省略#include <stdlib.h>
指令时,为什么编译器没有抱怨?
1990 C标准(有时称为&#34; ANSI C&#34;)允许调用尚未显式声明的函数。如果你写,例如:
#include
没有system("pause");
函数的可见声明,假设system
声明的返回类型为system
,参数与调用中的参数匹配 - 在此case,类型为int
的单个参数。这恰好与char*
的实际声明一致,因此使用C90编译器,您可以省略system
指令。一些支持更新的1999和2011标准(不允许隐式声明)的C编译器仍然允许旧形式,可能带有警告,以便向后兼容。
即使给出了C90编译器,依赖于现在过时的隐式#include
&#34;也没有优势。规则。只需添加int
即可。更一般地说,对于您调用的任何库函数,请阅读其文档和#include <stdlib.h>
声明它的标题。
至于为什么你的某个程序而不是另一个程序出错,我对此没有解释。也许您使用不同的设置调用了编译器。在任何情况下,它都不重要 - 尽管你可能会研究如何配置你的编译器,以便总是警告这样的事情,这样你就可以避免这种错误。 / p>
答案 2 :(得分:1)
在这里你需要了解两件事。
首先,你的代码工作得非常好,程序确实找到了3 ^ n的值。所以不要担心。
来到system()部分,
为了使用system();
函数,您需要包含stdlib.h头文件,因为该函数在该头中声明。
因此,最好包含标题(而不是评论它)。
现在,在Windows中使用了pause关键字,以便在程序完成后停止控制台关闭,它仅适用于Windows。
请注意,system("pause");
也不是标准,并且它不适用于其他计算机,即linux,使用system命令,您可以直接与命令行进行交互。在这方面,每个操作系统的命令都是特定的,它们不能用于其他操作系统。
因此,最好使用C标准库函数getchar();
来保存控制台窗口。