带大括号的 case 语句

sam*_*249 3 c switch-statement

为什么case语句允许在大括号内声明,但不允许在没有大括号的情况下声明?

比如下面的就不行

switch (op->name) {
    case 0:
        int a = 2;
    case 1:  
        int b = 3;
}
Run Code Online (Sandbox Code Playgroud)

但以下是可以的:

switch (op->name) {
    case 0: 
       {int a = 2;}
    case 1:  
       {int b = 3;}
}
Run Code Online (Sandbox Code Playgroud)

大括号解决了什么问题,没有它们,声明对编译器来说是不明确的?对我(C 初学者)来说,似乎每个 case 语句都应该有一个隐含的括号,直到下一个 case/default/end-of-switch,但这显然是错误的!

Joh*_*ger 5

为什么 case 语句允许在大括号内声明但不允许在没有它们的情况下声明?

我的编译器发出此错误消息:

error: a label can only be part of a statement and a declaration is not a statement
Run Code Online (Sandbox Code Playgroud)

我认为这很清楚。标签(包括 case 标签)不被视为独立的语句或声明,而是语句的组成部分。当控制分支到一个标签时,无论是通过 aswitch还是 a goto,都是程序跳转到的标签是其中一部分的语句。不是标签本身,它通常没有运行时表示。

诸如int a;不是语句和标签之类的声明不能是声明的一部分。另一方面,诸如{ int a; } are语句和 as 语句之类的块可以有标签。

这里没有基本的潜在约束。C 语法的定义可能不同,因此您的两个示例都是有效的。只是不是。