c - 带大括号的 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,但这显然是错误的!
解决方案
为什么 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 语法可能有不同的定义,因此您的两个示例都是有效的。事实并非如此。
推荐阅读
- pandas - pandas 中 agg() 和 aggregate() 函数的区别
- python - 在列表和列表中查找匹配的单词和不匹配的单词
- python - 如何制作 DataFrame 的曲面图?
- node.js - Node.js firebase 集成
- c++ - 如何解决 make-file 的 target 'run failed 错误的配方?
- google-cloud-platform - f1-micro 中的 GCLOUD Kubernetes 导致(f1-micro 机器的节点池由于内存不足不支持)
- python-2.7 - 使用 scapy 获取 DNS 数据包的原始负载
- javascript - 如何在 selenium-python 的 javascript 中处理 webelement 的 id - 而不是属性 id(!)?
- redirect - 想要从 URL 中删除语言,例如将 abc.com\en\about 重定向到 abc.com\about
- javascript - 如何在summernote文本编辑器中禁用右键单击