C语言case语句使用算术运算仍可编译?是否违反语法规则
问题解答
这一用法完全符合C语言的语法规则,你此前对case语句的语法记忆存在偏差。
核心规则说明
C语言标准明确要求:switch语句中case关键字后必须跟随整数常量表达式,只要符合以下要求的表达式都是合法的:
- 表达式运算结果为整数类型
- 表达式中所有运算对象都是编译期可确定值的常量(字符字面量、整数字面量、枚举常量、
sizeof返回值等都属于这类常量) - 整个表达式的求值可以在编译阶段完成,不需要运行时参与计算
你代码中的用法合法性解释
你代码中case 'b' + 'a'的写法完全符合上述要求:
- C语言中
'a'、'b'这类字符字面量本身就是int类型的常量,对应值就是字符的ASCII编码 - 两个常量的加法运算属于典型的常量表达式,编译器在编译阶段会直接计算出
'a'+'b' = 97 + 98 = 195,最终效果和直接写case 195:没有任何区别
常见误区澄清
你此前学习到的「case后不允许使用运算」是对规则的错误简化:
- 禁止的是包含变量的非常量表达式,例如如果定义了变量
int a = 10;,写case a + 5:才属于语法错误 - 只要是常量之间的合法运算,不管是算术运算符、位运算符还是其他符合要求的运算符,都可以在case后的表达式中使用
补充说明你的代码运行逻辑
你的代码中ch的值确实是195,switch匹配时会跳过所有值不匹配的case分支,直接执行case 'b'+'a'对应的打印语句,输出You entered a and b,符合预期。
内容的提问来源于stack exchange,提问作者Harish_Kanoje
相关产品推荐
相关产品推荐

