为什么我们在大括号前需要分号?

Why do we need semicolon before closing brace?

在C++中,为什么我们需要在大括号前加分号?奇怪的是

{
    statement;
    statement;
    statement
}

是不可能的,那个分号不只是定界语句。我明白class定义后的分号是必要的,因为可能有这个class的对象定义。但是这里有什么?

这是因为编译器希望每行代码都以分号结尾。没有这个它就不能确定语句。

它是必需的,以便编译器知道何时停止执行该行代码。即使它是右大括号之前的最后一行代码。

想象一下你正在写一篇文章。您是否在每个段落的最后一句都没有句号?有什么意义吗?

C++ 使用 ; 来确定语句的结束。

例如你可以这样写代码

Statement;statement;statement;

{ }表示您当前语句的范围。

例如:

  { int a(0);} //a "dies" at the } 
  a = 1; //error a is not found in current scope

这就是 C++ 语法的定义方式。分号用于将表达式转换为语句:

statement = expression ';'

例如:

a = 1;

a = 1是一个表达式,多加一个;就得到了可以执行的语句

同样,变量或类型声明必须以分号结尾:

struct S { int x; };

但是,函数定义和块语句不以 ;:

结尾
int main() {}

您可能会感到惊讶,因为您有 Pascal 背景。在 Pascal 中,分号用于分隔语句,因此您不需要最后一个分号。然而,如果你想写 2 个连续的块语句,在 C++ 中你写 {...} {...} 而在 Pascal 中你需要分号:begin ... end; begin ... end.

这是编程语言理论中的一个well-known区别,终止符与分隔符。如果分号是分隔符,则不需要最后一个分号。 C选择使用终止符,C++继承了这一点,Pascal使用分隔符

然而,事实证明终结者是更好的选择。与使用分隔符相比,程序员在使用终止符时犯的错误更少。 (Gannon & Horning,语言设计对可靠软件生产的影响。可靠软件国际会议论文集 1975)。