我们需要明确C语言中几种合法的常量形式:

(图片来源网络,侵删)
-
整型常量
- 十进制:
123,-456,0 - 八进制: 以
0开头,如012(表示十进制的10) - 十六进制: 以
0x或0X开头,如0xFF(表示十进制的255) - 长整型: 后跟
L或l,如123L - 无符号长整型: 后跟
UL或ul等,如123UL
- 十进制:
-
浮点型常量
- 一般形式:
14,-0.5 - 科学计数法:
14e2(表示 3.14 * 10^2 = 314),1E-5 - 后缀
f或F表示单精度浮点数:14f - 后缀
l或L表示长双精度浮点数:14L
- 一般形式:
-
字符常量
- 用单引号括起来的一个字符,如
'A','9', - 转义字符,如
'\n'(换行),'\t'(制表符),'\''(单引号本身)
- 用单引号括起来的一个字符,如
-
字符串常量
(图片来源网络,侵删)- 用双引号括起来的零个或多个字符,如
"Hello","123"
- 用双引号括起来的零个或多个字符,如
错误的常量示例分析
下面是一些典型的错误常量示例,并解释其错误原因:
0x2G
- 错误原因: 十六进制数中包含了非法字符
G。 - 正确形式: 十六进制数只能包含数字
0-9和字母a-f(或A-F)。0x2F是正确的。
456L
- 错误原因: 长浮点型常量的后缀错误。
- 正确形式: 长双精度浮点数的后缀是
L或l,单精度浮点数的后缀是F或f。456L实际上是正确的,它表示一个长双精度浮点数,但如果说它的意图是表示一个单精度浮点数,那么应该是456F,如果这个选项是456D,那才是错误的,因为C语言中没有D这个浮点后缀。
'abc'
- 错误原因: 字符常量只能包含一个字符。
- 正确形式:
'a'是一个字符常量。'abc'是一个非法的形式,会被编译器报错,如果需要表示多个字符,应该使用字符串常量"abc"。
1,000
- 错误原因: 在C语言中,逗号()是运算符,而不是数字分隔符。
- 正确形式: 千位分隔符在C语言中是不存在的,如果想表示一千,应该写成
1000,表达式(1, 1000)是一个逗号表达式,其结果为1000,但1,000本身不是一个合法的常量。
e10
- 错误原因: 科学计数法格式不完整。
- 正确形式: 科学计数法必须有尾数部分。
e10缺少尾数,编译器无法判断e是一个标识符还是一个科学计数法的开始,正确的写法是1e10或14e-2。
"a'
- 错误原因: 字符串未正确终止。
- 正确形式: 字符串常量必须用双引号括起来,并且右双引号必须是成对出现的。
"a'缺少结束的双引号,会导致编译错误。
078
- 错误原因: 八进制数中包含了非法数字。
- 正确形式: 八进制数只能包含数字
0-7。078中的8是一个非法的八进制数字,编译器会将其报错,如果想表示十进制的78,应该直接写78。
true 或 false
- 错误原因: 这不是C语言的关键字或常量。
- 正确形式: 在C语言中,没有内置的
true和false布尔常量,C99标准引入了<stdbool.h>头文件,可以使用true和false,但它们是通过宏定义实现的,而不是语言本身的常量,在标准C中,布尔值通常用整数1(真) 和0(假) 来表示。
| 错误的常量示例 | 错误原因 | 正确形式 |
|---|---|---|
0x2G |
十六进制包含非法字符 G |
0x2F |
'abc' |
字符常量只能有一个字符 | "abc" (字符串) 或 'a' (字符) |
1,000 |
逗号不是数字分隔符 | 1000 |
e10 |
科学计数法缺少尾数部分 | 1e10 |
"a' |
字符串缺少结束引号 | "a" |
078 |
八进制包含非法数字 8 |
78 (十进制) |
true |
C语言中没有内置布尔常量 | 1 (真) |
一个典型的错误的C语言常量是 'abc',因为它违反了字符常量必须为单个字符的基本规则。

(图片来源网络,侵删)
