C 远期申报是如何工作的?
我理解在main之前声明阶乘。但是,当阶乘公式在后面出现时,main如何计算答案呢C 远期申报是如何工作的?,c,visual-studio-2012,recursion,forward-declaration,C,Visual Studio 2012,Recursion,Forward Declaration,我理解在main之前声明阶乘。但是,当阶乘公式在后面出现时,main如何计算答案呢 #include <stdio.h> long long factorial(int); int main() { int n; long long f; printf("Enter a number and I will return you its factorial:\n"); scanf_s("%d", &n); if (n < 0
#include <stdio.h>
long long factorial(int);
int main()
{
int n;
long long f;
printf("Enter a number and I will return you its factorial:\n");
scanf_s("%d", &n);
if (n < 0)
printf("No negative numbers allowed!\n"); //prevent negative numbers
else
{
f = factorial(n);
printf("The factorial of %d is %ld\n", n, f);
}
return 0;
}
long long factorial(int n)
{
if (n == 0)
return 1;
else
return (n * factorial(n - 1));
}
#包括
长阶乘(int);
int main()
{
int n;
长f;
printf(“输入一个数字,我将返回它的阶乘:\n”);
扫描频率(“%d”和“&n”);
if(n<0)
printf(“不允许出现负数!\n”);//防止出现负数
其他的
{
f=阶乘(n);
printf(“%d的阶乘是%ld\n”,n,f);
}
返回0;
}
长阶乘(整数n)
{
如果(n==0)
返回1;
其他的
收益率(n*阶乘(n-1));
}
但是,当阶乘公式在后面出现时,main如何计算答案呢
#include <stdio.h>
long long factorial(int);
int main()
{
int n;
long long f;
printf("Enter a number and I will return you its factorial:\n");
scanf_s("%d", &n);
if (n < 0)
printf("No negative numbers allowed!\n"); //prevent negative numbers
else
{
f = factorial(n);
printf("The factorial of %d is %ld\n", n, f);
}
return 0;
}
long long factorial(int n)
{
if (n == 0)
return 1;
else
return (n * factorial(n - 1));
}
首先-main
不计算答案;这是你的阶乘
函数为你做的。另外,在编写程序时,我认为您需要了解3个步骤:
阶乘
函数。使用一个图标来查看这个
下图取自
发件人:
在计算机编程中,前向声明是
标识符(表示实体,如类型、变量、常量、,
或函数),程序员尚未给出完整的
定义。。。。
这对于单通道编译器和单独的
汇编转发声明用于需要
使用前声明;在这种情况下,相互递归是必要的
语言,因为无法定义此类函数(或数据
结构)在一个定义中没有正向引用:
必须首先定义函数(分别是数据结构)。它是
允许灵活的代码组织也很有用,例如
希望将主体放在顶部,并调用下面的函数
它
所以基本上,
main
函数根本不,需要知道factorial
是如何工作的。它是这样工作的:让我们举一个例子来找到3的factorial
递归:
因为0
的阶乘是1,1
的阶乘也是1,所以您可以这样写
if(n <= 1)
return 1;
if(n
但是,当阶乘公式在后面出现时,main如何计算答案呢
#include <stdio.h>
long long factorial(int);
int main()
{
int n;
long long f;
printf("Enter a number and I will return you its factorial:\n");
scanf_s("%d", &n);
if (n < 0)
printf("No negative numbers allowed!\n"); //prevent negative numbers
else
{
f = factorial(n);
printf("The factorial of %d is %ld\n", n, f);
}
return 0;
}
long long factorial(int n)
{
if (n == 0)
return 1;
else
return (n * factorial(n - 1));
}
C程序的执行顺序仅部分取决于文本的显示顺序
例如,查看您正在使用的printf
函数。它根本不会出现在您的程序中,而是在链接到您的程序的库中
forward声明表明(从翻译单元中的这一点开始)预期存在这样一个函数,该函数具有特定的名称、参数和返回值
简单的答案是,C程序在开始执行之前会从头到尾进行处理。因此,在调用main
时,C编译器已经看到并处理了factorial
函数
一个地址被分配给编译后的factorial
函数,当程序链接时,该地址被“反补丁”到编译后的main
函数中
之所以需要前向声明,是因为C是一种老式的语言,最初设计为允许一次编译。这意味着编译器“按原样翻译”:翻译单元中前面的函数在看到后面的函数之前被编译和发出。要正确编译对后面出现的函数(或通常出现在其他地方,如另一个翻译单元中)的调用,必须公布有关该函数的一些信息,以便在该点上知道它。因为在主函数中,当编译器看到此f=factorial(n)时
函数,编译器不知道它的意思。它不知道要定义的函数在哪里,但它知道函数接收的参数是正确的,因为它是一个用户定义的函数,在主函数之后有它的定义
因此,应该有某种方法告诉编译器,我正在使用一个名为factorial
的函数,该函数返回带有单个int
参数的long
;因此在main()
之前定义函数的prototype
无论何时调用函数factorial
,编译器都会与函数prototype
进行交叉检查,并确保正确的函数调用
如果在main之前定义函数,则不需要函数原型
不需要功能原型的示例情况:
/*function prototyping is not required*/
long long factorial(int n)
{
//body of factorial
}
int main()
{
...
f=factorial(n);
...
}
在这里,编译器知道factorial
的定义;在main中调用它之前,它还知道返回类型、参数类型和函数名。您以前声明过它。这就是在最后一个链接完成之前,带着希望和梦想编译所需的全部main
,它将找到一个匹配的事实里亚尔
真的打电话。画面很美。你这么快就做到了,真是疯了!@self-google;)。如果你从其他地方得到了一张图表,你应该在你的回答中把这个来源归功于它。@JonathanLeffle