首页 > 解决方案 > 带大括号的 case 语句

问题描述

为什么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,但这显然是错误的!

标签: cswitch-statement

解决方案


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

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

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

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

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

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


推荐阅读