【问题标题】:Can Function declaration or function prototype affects the working of the program函数声明或函数原型会影响程序的工作吗
【发布时间】:2017-12-07 22:56:20
【问题描述】:

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

  1. 函数声明或函数原型
  2. 函数调用
  3. 函数定义

但是,当我解决一个数字的阶乘问题时,我在代码中了解到,当我在 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);
}

【问题讨论】:

  • 回答标题问题,如果函数不返回 int 并且您仍在使用以前不需要显式声明函数的古老 (C90) C 的编译模式它们被使用,然后滥用返回 double 或指针的函数,例如,没有声明会产生问题。旧 C (C99) 和现代 C (C11) 都要求在使用函数之前声明它们。在调用它们之前,您应该确保在范围内有一个函数原型。您的main() 在 C99 或 C11 中无效;返回类型 int 是必需的。
  • 另外,不要把return语句当作函数。删除那些括号。

标签: c


【解决方案1】:

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

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

在这种情况下,你很幸运,函数的默认声明恰好与你的函数 fact 匹配。默认声明是一个函数,它返回int 并接受您传递给它的任何参数,但受默认参数提升的影响。 (粗略地说,默认参数提升是将小于int 的整数转换为int,并将float 值转换为double。因此,如果函数返回int 并且只接受@987654328 @ 和double 参数,可以匹配默认声明。)

一个好的编译器会警告您缺少声明或声明错误。你的编译器有“开关”或其他选项,告诉它你想要什么样的警告和错误消息。您应该要求提供大量警告消息。

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

【讨论】:

  • MSVC 甚至不支持 C99。 OT 混杂代码会鼓励量子纠缠吗?
猜你喜欢
  • 2011-08-07
  • 1970-01-01
  • 2012-07-15
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多