常量和字面量
这一节讨论“值是怎样写进源码、又在何处被当作常量使用”的问题。它看似基础,却直接影响类型推导、表达式求值和接口边界。
1. 先区分两个概念
字面量是写在源码里的记号,例如 123、3.14、'A'、"abc";常量则是某个语境中被要求“值不可变或可在编译期确定”的表达式结论。二者经常重叠,但并不完全等同。把这个区别先建立起来,后面读枚举、数组大小和条件编译会更顺畅。
2. 本节目录
4.2.1 true false 负责布尔常量语义,4.2.2 整数常量 浮点常量 字符常量 负责数值与字符字面量规则,4.2.3 字符串字面量 负责空终止文本对象的表示方式。
3. 阅读重点
建议把重点放在“类型”和“边界”:不同后缀如何影响整数常量类型,浮点字面量默认类型是什么,字符常量和字符串字面量在对象模型上有什么差异。只要类型判断稳定,很多表达式问题会在编码前就被排除。
4. 常量表达式的常见语境
很多语法位置会要求常量表达式,例如 switch 的 case 标签、枚举器值、某些对象大小与对齐相关语境。理解“字面量只是来源、常量表达式是语境要求”这一点后,你会更容易判断一段写法是语法不合法,还是仅仅类型不匹配。
5. 后缀与可读性
当常量值将参与位运算、无符号比较或宽度敏感计算时,显式后缀(如 u、ull)通常比依赖默认类型更清楚。后缀写清楚后,表达式提升路径也更容易推断。
6. 字面量与接口契约
字面量不仅是“写一个值”,也是接口契约的组成部分。例如某个接口要求无符号掩码,调用点就应给出无符号常量;某个接口约定单精度路径,调用点就应给出 f 后缀常量。把这层契约写在字面量上,类型系统才能在编译期帮你尽早发现偏差。
7. 先定语义再选写法
同一个数值通常有多种写法:十进制、十六进制、科学计数法、带后缀版本。推荐先确定语义目标,再确定表示形式:强调位模式就用十六进制,强调数量级就用科学计数法,强调精度路径就用类型后缀。这样代码不只“能跑”,也能直接表达意图。
8. 习题
判断下面每个记号属于哪一类字面量,并说明其类型大致是什么:
123123u3.14'A'"A"
写一段代码,分别演示:
- 字符常量与字符串字面量的区别;
- 解释为什么字符串字面量不可被修改(标准层面结论即可,不要求写出涉及指针/数组的示例代码)。