Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 远期申报是如何工作的?_C_Visual Studio 2012_Recursion_Forward Declaration - Fatal编程技术网

C 远期申报是如何工作的?

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

我理解在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)
        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