c - 为什么一个线性函数需要大括号?

标签 c language-design

我们可以做到

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/

相关文章:

syntax - 为什么经典的 ASP 服务器端包含在注释中?

python - "Least Astonishment"和可变默认参数

scala - 由于扩展递归类型参数,关于类图不是有限的编译器错误

c# - 为什么在通用参数约束中强制执行某些顺序?

C: STRTOK 异常

c++ - 为什么在 C/C++ 中可以多次包含一个 header ?

c - C 中的位置换表

c - C 中是否可以使用按位运算符生成 x%10(模 10)?

c - 为什么下面的代码中有竞争条件

c++ - 如何在 Linux 或 Windows 中为 OS X 编译?