我们可以做到
if(condition)
doThis();
还有这个
while(condition)
doThat();
但不是这个
int giveMeFive()
return 5; // Error: expected a '{'
为什么不呢?
我知道语言语法在函数定义上需要 {
和 }
。我问的是条件语句(不需要大括号)和函数定义(需要大括号)之间区别的基本原理。
最佳答案
原因似乎主要是历史原因。
在 1989 年 ANSI C 标准之前,C 没有原型(prototype)。 int
类型的参数可以隐式定义; int
以外类型的参数必须在开始 {
之前明确定义。
例如,在现代 C 语言中我们可以写成:
double sum(double x, double y) {
return x + y;
}
在 ANSI (K&R) C 之前的版本中,我们必须编写:
double sum(x, y)
double x;
double y;
{
return x + y;
}
函数体可能以局部变量的声明开始:
double sum(x, y)
double x;
double y;
{
double z;
/* ... */
}
开始的 {
需要将参数定义与函数体分开,结束的 }
需要匹配开始的 {
.
(此语法在现代 C 中仍然允许,但已过时;在 C++ 中不允许。)
当原型(prototype)被添加到语言中时,没有特别的理由允许在函数定义中省略 {
和 }
。
简单的答案是,这就是语言语法所要求的。 函数定义的语法是:
declaration-specifiers declarator declaration-listopt compound-statement
其中 复合语句 由 {
,后跟 0 个或多个声明和语句,再后跟 }
组成。这是唯一需要复合语句的语法生成;还有很多其他的只需要一个声明。
有趣的是,在 C 的前身语言 B(documented here)中,函数定义的语法是:
name ( arguments ) statement
该语句通常是复合语句(由 {
和 }
分隔的 block ),但这不是必须的。 B 不要求,甚至不允许参数和变量指定其类型,因此无需使用特定语法来将带括号的参数列表与函数体分开。在我能找到的最早的 C 引用资料 ( this one, from 1974 ) 中,函数定义的语法已更改为需要复合语句,可能是为了适应添加的参数声明。
关于c - 为什么一个线性函数需要大括号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31838836/