为什么一个衬垫功能需要支架?

cam*_*ous 5 c language-design

我们做得到

if(condition)
    doThis();
Run Code Online (Sandbox Code Playgroud)

还有这个

while(condition)
    doThat();
Run Code Online (Sandbox Code Playgroud)

但不是这个

int giveMeFive()
    return 5; // Error: expected a '{'
Run Code Online (Sandbox Code Playgroud)

为什么不?

我知道语言语法需要{}函数定义.我问的是条件语句(不需要大括号)和函数定义(它们之间)之间差异的基本原理.

Kei*_*son 12

原因似乎主要是历史性的.

在1989 ANSI C标准之前,C没有原型.int可以隐式定义类型的参数; int在开放之前必须明确定义的类型的参数{.

例如,在现代C中我们可以写:

double sum(double x, double y) {
    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

在ANSI(K&R)C之前,我们必须写:

double sum(x, y)
double x;
double y;
{
    return x + y;
}
Run Code Online (Sandbox Code Playgroud)

函数体可以以局部变量的声明开头:

double sum(x, y)
double x;
double y;
{
    double z;
    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

{需要开口将参数定义与函数体分开,并且}需要关闭以匹配开口{.

(在现代C中,这种语法仍然是允许的,但是过时了;在C++中不允许这样做.)

当原型被添加到语言中时,没有特别的理由允许省略{}函数定义.

琐碎的答案就是语言语法所需要的.函数定义的语法是:

声明特定声明者声明列表opt复合声明

其中复合语句包含{,后跟0或更多声明和语句,后跟}.这是唯一需要复合语句的语法生成; 还有很多其他人只需要一份声明.

有趣的是,在C的前一种语言中,称为B(此处记载),函数定义的语法是:

name ( arguments ) statement
Run Code Online (Sandbox Code Playgroud)

该语句通常是一个复合语句(由{and 分隔的块}),但不是必须的.B不需要甚至不允许参数和变量指定其类型,因此不需要使用特定语法将带括号的参数列表与函数体分开.在我能找到的最早的C引用中(这个,从1974年开始),函数定义的语法已被更改为需要复合语句,可能是为了适应参数声明的添加.


Mar*_*n G 10

如果允许,函数声明之间没有区别:

void a();
Run Code Online (Sandbox Code Playgroud)

以及函数什么都不做的函数定义:

void a()
  ;
Run Code Online (Sandbox Code Playgroud)

它肯定会增加更多的问题而不是获得.