我们做得到
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)
它肯定会增加更多的问题而不是获得.