C语言 出现 “从属语句不能是声明”的情况和解决办法

本文记录了一个在C语言编程中遇到的‘从属语句不能是声明’的错误,该问题源于误删了一个else的括号对。作者在VSCode中查找错误颇费周折,提醒读者对于基础错误的检查也不可忽视,简单的IDE可能使问题定位更困难。提供了解决此类问题的经验分享。

C 出现 “从属语句不能是声明”的情况和解决办法

发blog的时候是六一儿童节!2023.6.1,过期的小朋友们都节日快乐!
笔者在遇到这个bug的时候的情况是这样的
在这里插入图片描述
在查阅了网上的一些资料后也没有发现对应的解决办法,最后发现是一个很基础的问题,但是由于目前为止网上没有这种错误的记录和解决办法,并且基础简单的错误检查起来也很困难,所以写下下篇blog记录一下,同时也希望可以更快帮助碰到这样问题的小伙伴去发现和解决错误。
我碰到的代码情况是这样的
在这里插入图片描述
其实问题就出在于,我在修改的代码的时候误删了一个else的括号对导致的,但是由于太过于基础,导致没有发现错误。在vscode上找这个错误也找了一段时间,如果是一些没有提示和一些高亮的IDE找到问题可能更麻烦。
最后笔者也祝大家
在这里插入图片描述

<think>我们正在讨论的是编程语言中的switch-case语句(在Pascal中称为CASE语句)的缩进规范问题。 用户问题:在CASE语句中,整形数字、ELSECASE是否应该在同一个缩进级别? 分析: 根据编程规范,通常建议: 1. CASE关键字与SELECTOR在同一行或单独一行(根据规范风格不同,可能有差异) 2. 每个WHEN分支(包括整形数字标签)应该相对于CASE进行缩进(通常一个缩进级别) 3. THEN后面的语句应该相对于WHEN再缩进一个级别(或者与THEN在同一行,如果语句很短) 4. ELSE分支(如果有)应该与WHEN分支在同一缩进级别 因此,我们可以这样归纳: - CASE(整体结构)通常不缩进(与周围代码同级) - 每个WHEN(包括后面的整形数字、表达式)应该比CASE缩进一级(例如一个Tab或4个空格) - THEN后面的语句(如果换行)应该比WHEN再缩进一级(或者在同一行写语句) - ELSE应该与WHEN在同一缩进级别 示例(Pascal风格,注意引用[1]): 引用[1]提到:CASE语句结构为: CASE SELECTOR WHEN EXPRESSION 1 THEN STATEMENT 1; WHEN EXPRESSION 2 THEN ... 这里,WHEN相对于CASE进行了缩进。 另外,引用[4]也提到:switch...case...break结构(C语言)中,通常case标签缩进一级,然后里面的语句再缩进一级。 所以,对于用户的问题: 整形数字(即case标签中的常量)应该WHEN(或C语言中的case)关键字在同一行,并且整个分支标签(包括整形数字)相对于上一级缩进一级。 ELSE(相当于default)应该WHEN(或case)在同一缩进级别。 下面给出两种语言的示例: 1. Pascal风格(参考引用[1]): ```pascal CASE grade OF 1: Writeln('Poor'); 2: Writeln('Fair'); 3,4: Writeln('Good'); 5: Writeln('Excellent'); ELSE Writeln('Invalid grade'); END; ``` 这里的缩进: - CASEELSE在同一列(不缩进) - 数字标签(1,2,3,4,5)与CASE缩进一级(通常2个空格或4个空格) 2. C语言风格(参考引用[2][3][4]): ```c switch (grade) { case 1: printf("Poor\n"); break; case 2: printf("Fair\n"); break; case 3: case 4: // 多个case标签可以连续写 printf("Good\n"); break; case 5: printf("Excellent\n"); break; default: printf("Invalid grade\n"); } ``` 这里的缩进: - switch与{在同一行(或单独一行),{之后换行 - 每个case标签(包括default)相对于switch缩进一级(通常4个空格) - case标签内的语句相对于case标签再缩进一级(通常4个空格,所以总共8个空格) 因此,总结回答: 在CASE语句中: - 整形数字(作为分支标签)应该与CASE(或WHEN)关键字在同一行,并且相对于外层结构(如switch或CASE)缩进一级。 - ELSE(或default)应该与分支标签(即case)在同一缩进级别。 注意:不同编程语言不同代码规范可能有差异,但上述规则是常见规范。 相关问题: 1. 在多层嵌套的switch语句中,如何保持缩进清晰? 2. 如果case标签的语句非常简单,能否不换行? 3. 是否有工具可以自动格式化switch-case语句的缩进? </think>### CASE语句中的缩进规范分析 在CASE语句中,**整形数字标签、ELSE分支CASE关键字通常应处于同一缩进级别**,这是主流的代码规范要求。具体规则如下: #### 1. **基本缩进结构** ```pascal CASE selector OF 1: // 整形数字标签(与CASE同级缩进) statement1; 2: // 整形数字标签 statement2; ELSE // ELSE分支(与数字标签同级) default_statement; END; ``` - **整形数字标签**(如`1:`, `2:`)与**CASE关键字**对齐(无额外缩进) - **ELSE分支**与数字标签保持同一缩进级别 - **执行语句**需额外缩进一级(通常2-4空格),表示从属关系 #### 2. **规范依据** - **一致性原则**:所有分支标签(数字/ELSE)作为等价的逻辑入口点,应同级对齐[^1]。 - **可读性要求**:同级缩进快速标识分支入口,嵌套语句缩进区分执行逻辑[^4]。 - **避免错误**:ELSE与分支同级缩进可防止因缩进错误引发的逻辑混淆[^2]。 #### 3. **错误示例对比 ```pascal // 错误:ELSE与数字标签未对齐 CASE grade OF 90..100: Write('A'); 80..89: Write('B'); ELSE // 错误!缺少缩进导致层级混乱 Write('F'); END; // 正确:所有分支入口同级对齐 CASE grade OF 90..100: Write('A'); 80..89: Write('B'); ELSE Write('F'); // ELSE与数字标签对齐 END; ``` #### 4. **特殊场景处理 - **多语句分支**:执行语句需额外缩进 ```pascal CASE cmd OF 1: BEGIN // 额外缩进一级 DoTaskA; LogAction; END; 2: DoTaskB; // 单条语句可不换行 END; ``` - **嵌套CASE**:外层/内层CASE关键字同级 ```pascal CASE outer OF 1: CASE inner OF // 与外层数字标签同级 10: ... ; END; END; ``` > **行业实践**:Pascal的ISO标准[^1]C/C++编码规范[^4]均要求分支标签(包括ELSE)保持同级缩进,而执行体额外缩进以提高可读性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原创小白变怪兽

帮助原创小白成为怪兽吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值