为什么在函数原型之后需要使用分号

时间:2015-11-20 18:47:59

标签: c function declaration function-prototypes

为什么我们在第二行int add(int,int)语句后使用分号。

#include<stdio.h>
int add(int,int);
int main()
{
int a,b,c;
scanf("%d %d",&a,&b);
c=add(a,b);
printf("The sum of the 2 numbers is %d",c);
return 0;
}
int add(int x,int y)
{
int sum;
sum=x+y;
return sum;
}

7 个答案:

答案 0 :(得分:5)

在C语法中,声明的定义方式如下

declaration:
    declaration-specifiers init-declarator-listopt ;
                                                  ^^^ 

正如您所见,分号是必需的。

这个

int add(int,int);

是一个函数声明。因此,您必须在声明的末尾放置一个分号。

比较两个程序

int main( void )
{
    int add( int x, int y )

    {
        //...    
    }
}

int main( void )
{
    int add( int x, int y );

    {
        //...    
    }
}

第一个程序无效,因为编译器会认为函数add是在函数main中定义的。

第二个程序有效。 main中有一个函数声明和一个代码块。

因此需要使用分号来解除其他程序结构的声明。

答案 1 :(得分:2)

int add(int, int);

这是一个前向声明 - 它是一种告诉编译器的方法“有一个名为'add'的函数需要两个整数,所以如果你看到我使用它只是信任我,我将在以后定义它”。因为你还没有定义它,所以你不需要{}花括号。分号出现在C中每行代码的末尾,但在某些大括号之后(例如if语句,函数定义)除外。因此,在前瞻声明之后仍然需要一个分号。

答案 2 :(得分:1)

C中的分号结束语句。所以分号告诉C声明add函数的语句已经终止,后面的任何内容都是新语句。 在这种情况下,这是一个函数声明,分号表示没有更多的预期。如果没有分号,那么花括号中的函数定义就像main() {...}

一样

答案 3 :(得分:0)

如果没有分号,编译器需要一个函数定义(以开括号开头)或逗号将一个定义与下一个定义分开。

答案 4 :(得分:0)

分号只是一个终止字符。由于没有定义函数的主体(例如,与main() { ... }不同),这是让编译器知道不期待任何其他内容的一种方式。

答案 5 :(得分:0)

了解C / C ++中的声明和定义很重要。当您声明变量或函数时,您告诉编译器有一些名称已指定类型的名称。编译器不必完全定义变量或函数。

在该示例中,首先声明函数然后定义该函数。声明语句的语法应包含分号。

通过阅读以下内容,您可以获得更清晰的概念:http://www.cprogramming.com/declare_vs_define.html

答案 6 :(得分:0)

这是必要的历史原因,最初,在K&amp; R C中,add()本来是这样写的:

int add()
int x;
int y;
{
  return x+y;
}

在原型之后没有分号,很难区分它:

 int add();
 int x;
 int y;

 {
   /* A nested block. */
 }

请记住,C预处理器是一维的,并将程序转换为由空格分隔的标记列表。解析器无法看到换行符或缩进来猜测你的意思。

另外,C中的语句通常以分号结尾,并且比编程人员记住一堆任意异常更容易保持一致。