2.6 常量和字面量
把值直接写进源码,看起来只是选一种写法;实际上,写法还会决定这个值的类型,进而影响整个表达式的计算方式。
本节的主体示例适用于 C11、C17 和 C23。
1. 从一个意外的结果开始
先运行下面的程序:
c
#include <stdio.h>
int main(void) {
double first = 1 / 2;
double second = 1.0 / 2.0;
printf("%.1f\n", first);
printf("%.1f\n", second);
return 0;
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
输出为:
bash
0.0 0.5
第一行为什么不是 0.5?
1 和 2 是整数常量,因此 1 / 2 先进行整数除法,结果为 0,随后才用这个结果初始化 double 对象。1.0 和 2.0 则是 double 类型的浮点常量,所以 1.0 / 2.0 的结果是 0.5。
程序中只改了值的写法,计算结果就发生了变化。这正是本节要建立的认识:源码中的值不仅有数值或文本内容,还有类型。
2. 四种常见写法
观察下面四个记号:
c
1
1.0
'1'
"1"1
2
3
4
2
3
4
它们分别表示整数、浮点数、字符和字符串,不能互相替换。在日常教学中,这些直接写进源码的形式常被统称为“字面量”。严格按照 ISO C 的词法分类,1、1.0、'1' 分别是整数常量、浮点常量和字符常量,"1" 是字符串字面量。
阅读后续内容时,先问两个问题:
- 这个记号表示数、字符,还是真正的文本?
- 它具有什么类型,会怎样影响所在的表达式?
3. 按顺序学习
先阅读 2.7 true / false,了解 C 怎样表示逻辑上的真与假。
接着阅读 2.8 整数常量、浮点常量和字符常量,学习数值的进制、后缀、类型以及字符常量。
最后阅读 9.1 字符串字面量,弄清单个字符与一段文本为什么是两种不同的写法。
学完这三部分后,再回到开头的程序。此时你应当能够从 1 和 1.0 的类型出发,独立解释两行输出为什么不同。
4. 习题
#10201
⚡3⏳2
判断下面每个记号属于整数常量、浮点常量、字符常量还是字符串字面量,并写出它的类型:
123123u3.14'A'"A"
#10202
⚡5⏳3
写一段代码,分别演示:
- 字符常量与字符串字面量的区别;
1 / 2与1.0 / 2.0的结果区别。
说明每个结果产生的原因,不要编写修改字符串字面量的代码。