繁体   English   中英

带大括号的 case 语句

[英]Case statement with braces

为什么case语句允许在大括号内声明,但不允许在大括号内声明?

比如下面的不行

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

但以下是可以的:

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

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

为什么 case 语句允许在大括号内声明,但不允许在大括号内声明?

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

 error: a label can only be part of a statement and a declaration is not a statement

我认为这很清楚。 标签,包括案例标签,不被认为是独立的语句或声明,而是语句的组成部分。 当控制分支到 label 时,无论是通过switch还是goto ,程序跳转到的都是 label 所在的语句。 不是 label 本身,它通常没有运行时表示。

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

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

这是无效的原因:

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

是因为您在声明前面有一个label (在这种情况下是一个case标签)。 label 只能出现在语句之前。

使用大括号是有效的,因为它们用于表示复合语句,这是一种特定类型的语句,并且语句可以紧接在 label 之前。

形式上,label 是标记语句的一部分。 这在C 标准的第 6.8.1 节中有详细说明:

 labeled-statement: identifier: statement case constant-expression: statement default: statement

试试这个,你不会得到错误:

switch (op->name) {
    case 0:; /* <--- that ; is essential, see below */
        int a = 2;
    case 1:; /* <--- the same here. */
        int b = 3;
}

问题是case语句statement的一个特例,但声明不是statement的有效替代,因此不允许在case label之后立即声明 但是您始终可以使用分号结束case_statement (发出null 语句),然后将您的声明放在它后面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM