函数声明或函数原型可以影响程序的工作

时间:2017-12-07 22:56:20

标签: c

我是编程领域的新手,当我在C语言中编写函数时,我开始知道函数中有三个最重要的部分,即 -

  1. 功能声明或功能原型
  2. 函数调用
  3. 功能定义
  4. 但是,当我解决一个关于一个数字的阶乘的问题时,我在我的代码中发现当我在main()上面的代码中没有包含函数声明或函数协议时,代码仍在运行并给出了输出为120.所以我的问题是为什么函数声明或函数原型不影响我的程序的输出,或者没有必要在main()上面包含函数声明或原型。

    -------Code-----
    #include<stdio.h>
    #include<conio.h>
    
    // int fact(int);
    main()
    {
       int x;
       x=fact(5);
       printf("The factorial is =%d",x);
    }
    
    int fact(int n) 
    {
      int f=1,i;
      for(I=1;i<=n;i++)
           f=f*I;
        return (f);
    }
    

1 个答案:

答案 0 :(得分:4)

如果使用函数而不声明它,编译器可能会提供默认声明。这不是现代C的一部分,但编译器可能会使用旧标准或在这方面过于宽松。 (最好要求显式声明,因为它有助于减少错误。)

函数的任何声明都必须与函数的定义匹配。声明为编译器提供有关如何调用该函数的信息。如果声明不匹配,事情可能会出错。所以,是的,声明会影响你的程序;它可以打破它。

在这种情况下,幸运的是,函数的默认声明恰好与您的函数fact匹配。默认声明是一个函数,它返回int并接受您传递的任何参数,受默认参数提升的限制。 (粗略地说,默认参数促销是比int更窄的整数转换为intfloat值转换为double。因此,如果函数返回int并且只接受intdouble个参数,它可以匹配默认声明。)

一个好的编译器会警告你缺少声明或声明是错误的。您的编译器具有“开关”或其他选项,告诉它您需要什么类型的警告和错误消息。你应该要求许多警告信息。

您的编译器可能还有开关,说明要使用哪个版本的C. (已有多个标准版本,最近一次是1999年和2011年,并且有一些非标准版本。)您可能希望请求您的编译器使用C 2011标准,直到您有充分的理由进行更改。 (不幸的是,如果您使用的是Microsoft Visual C,我认为它不支持C 2011。)