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,但这显然是错误的!
为什么 case 语句允许在大括号内声明但不允许在没有它们的情况下声明?
我的编译器发出此错误消息:
Run Code Online (Sandbox Code Playgroud)error: a label can only be part of a statement and a declaration is not a statement
我认为这很清楚。标签(包括 case 标签)不被视为独立的语句或声明,而是语句的组成部分。当控制分支到一个标签时,无论是通过 aswitch还是 a goto,都是程序跳转到的标签是其中一部分的语句。不是标签本身,它通常没有运行时表示。
诸如int a;不是语句和标签之类的声明不能是声明的一部分。另一方面,诸如{ int a; } are语句和 as 语句之类的块可以有标签。
这里没有基本的潜在约束。C 语法的定义可能不同,因此您的两个示例都是有效的。只是不是。