常量的表示
整型
下面是一个整型常量,该常量用十六进制表示为
64
64
64,为unsigned long long
类型。
0x64ULL
一般地,一个整型常量可以分为四个部分:
[进制][数字][长度][类型]
程序代码中的数字若不加前缀,默认为十进制。常用的进制还有八进制或十六进制。数字前添加前缀0
表示八进制数,数字前添加前缀0x
或0X
表示十六进制数。数字的表示必须符合前缀规定的进制。
下面是一些不同进制的整数的例子:
123456
0264370
0x7f938e
数字若不加后缀,默认为int
类型。若超过了int
能表示的范围,则为long
类型。若超过了long
能表示的范围,则为unsigned long
类型。若仍然不能表示该数,则为long long
或unsigned long long
类型。
若要用长度较长的数据类型储存较小的数字,可以添加后缀。后缀l
或L
表示用long
类型存储,后缀ll
或LL
表示用long long
类型存储,可以形象地理解成一个l
或L
表示一个long
(但lL
和Ll
没有意义)。
若要强调无符号类型,可以添加后缀u
或U
,该后缀可以形象地理解成unsigned
。无符号类型后缀与长度后缀的先后顺序不作要求,大小写也可以不统一。例如下面是有意义的后缀:ul
uLL
lU
LLu
。下面是没有意义的后缀:uLl
lLU
lul
LuL
。
有符号类型的正数,其正号可以省略。
下面是一些不同类型的整数的例子:
0ll
-69028
12345678987654321ULL
字符
打印字符可以表示为添加单引号的字符。如字符A
:
'A'
非打印字符可以通过转义序列赋值,同样需要添加单引号。如换行符:
'\n'
下表是部分字符对应的转义序列:
转义序列 | 含义 |
---|---|
\a | 警报:发出蜂鸣,但不移动屏幕光标 |
\b | 退格:把活跃位置左移。通常不会擦除经过的字符 |
\f | 换页:把活跃位置移至下一页的开始处(只有在输出到打印机上时才有效) |
\n | 换行:把活跃位置移至下一行的开始处 |
\r | 回车:把活跃位置移至当前行的开始处 |
\t | 水平制表符:把活跃位置移至下一个水平制表点 |
\v | 垂直制表符:把活跃位置移至下一个垂直制表点(只有在输出到打印机上时才有效) |
\\ | 反斜杠 |
\' | 单引号 |
\" | 双引号 |
\? | 问号 |
除上表外,还有一种转义序列,通过字符的ASCII码表示该字符。使用转义序列时,ASCII码只能使用八进制或十六进制。在\
后直接添加ASCII码,或在ASCII码前添加前缀0
,均表示八进制;在ASCII码前添加前缀x
或X
表示十六进制。例如下面都是字符A
的转义序列(字符A
的ASCII码的八进制表示为
101
101
101,十六进制表示为
41
41
41)。
'\101'
'\x41'
浮点型
下面是一个用e
计数法表示的浮点型常量,该常量等于
2.87
×
1
0
−
3
=
0.00287
2.87\times 10^{-3}=0.00287
2.87×10−3=0.00287,为float
类型。
2.87E-3F
下面是一个用p
计数法(C99)表示的浮点型常量,该常量等于
(
10
+
1
16
+
15
256
)
×
2
10
=
10364.0
\left(10+\dfrac 1{16}+\dfrac{15}{256}\right)\times 2^{10}=10364.0
(10+161+25615)×210=10364.0,为double
类型。
0xa.1fp10
一般地,一个浮点型常量可以分为五个部分:
[整数部分].[小数部分][指数部分][类型]
e
计数法表示的浮点数aeb
或aEb
可以理解成
a
×
1
0
b
a\times 10^b
a×10b,但是不必满足科学记数法的形式,其中a
为有符号十进制小数,b
为有符号十进制整数,正号可以省略。若
a
a
a的整数部分为
0
0
0,整数部分可以省略(但若小数部分也为
0
0
0则不能省略);若
a
a
a的小数部分为
0
0
0,小数部分可以省略;若
b
=
0
b=0
b=0,则eb
或Eb
可以省略(但若小数部分已省略则不能省略)。
下面是一些用e
计数法表示的浮点数的例子:
-32.576
.618
28.E-6
2.95e-8
6e3
p
计数法表示的浮点数apb
或aPb
可以理解成
a
×
2
b
a\times 2^b
a×2b,其中a
为有符号十六进制小数(需要添加前缀0x
或0X
),b
为有符号十进制整数,正号可以省略。
浮点数默认为double
类型,可以通过添加后缀来改变数据类型。后缀f
或F
表示用float
类型存储,后缀l
或L
表示用long double
类型存储。
printf()
输出
输出格式控制符的基本格式如下:
%[标记][最小字段宽度].[指定精度][长度][类型]
标记、宽度、精度
标记分为五种,可以同时使用多种,也可以都不使用。这里先介绍四种:
-
表示左对齐;+
表示显示数字的符号;- 空格表示显示前导空格;
0
表示显示前导零。
下面是+
标记的例子:
printf("%+d\n",215);
printf("%+d\n",-215);
其输出的结果为
+215
-215
-
、空格、0
通常和最小字段宽度搭配使用。最小字段宽度通常用十进制整数表示;也可使用字符*
,此时最小字段宽度为printf()
的下一个参数。若该字段不能容纳待打印的内容,系统会使用更宽的字段。
示例一:
printf("[%3d]\n",7939);
printf("[%6d]\n",7939);
printf("[%-6d]\n",7939);
printf("[% 6d]\n",7939);
printf("[%06d]\n",7939);
[7939]
[ 7939]
[7939 ]
[ 7939]
[007939]
示例二:
int width=6;
printf("[%*d]\n",width,7939);
[ 7939]
最小字段宽度后紧跟的是指定精度。与最小字段宽度类似,指定精度用十进制整数或字符*
表示;但数字(或字符*
)前面必须有一个.
。若既没有.
也没有数字(或字符*
),则不指定精度;若只有.
而没有数字(或字符*
),相当于.
后面有一个数字0
。指定精度的含义稍后说明。
长度与类型
输出格式控制符中的长度如下:
修饰符 | 类型 | 含义 |
---|---|---|
h | 整型 | short |
hh | 整型 | char 类型 |
j | 整型 | intmax_t 类型(无符号为uintmax_t 类型)1 |
l | 整型 | long |
ll | 整型 | long long (C99) |
L | 浮点型 | long double 类型 |
t | 整型 | ptrdiff_t 类型(C99)2 |
z | 整型 | size_t 类型(C99)3 |
类型如下:
类型 | 含义 |
---|---|
a 或A | 浮点数,p 计数法(C99) |
c | 字符 |
d 或i | 有符号十进制整数 |
e 或E | 浮点数,e 计数法 |
f | 浮点数 |
g 或G | 浮点数,指数小于
−
4
-4
−4或大于等于精度时选择%e 或%E ,否则选择%f |
o | 无符号八进制整数 |
p | 指针 |
s | 字符串 |
u | 无符号十进制整数 |
x 或X | 无符号十六进制整数 |
% | 百分号 |
长度和类型可以搭配使用,例如%d
表示以int
类型输出,%hd
表示以short
类型输出,%Lf
表示以long double
类型输出。特别地,%%
输出百分号,不过在不与格式控制符混淆的情况下也可直接用%
输出百分号。
示例一:
printf("%d\n",12345678987654321);
printf("%lld\n",12345678987654321);
printf("%hd\n",12345);
printf("%hhd\n",12345);
1653732529
12345678987654321
12345
57
示例二:
printf("%f\n",28.5970);
printf("%e\n",28.5970);
printf("%a\n",28.5970);
printf("%g\n",28.5970);
28.597000
2.859700e+01
0x1.c98d4fdf3b646p+4
28.597
示例三:
printf("%d\n",7939);
printf("%o\n",7939);
printf("%x\n",7939);
7939
17403
1f03
补充
下面介绍不同类型下的指定精度和第五种标记#
的含义。
- 对于一般的浮点型
e
或E
或f
,指定精度表示小数点右边数字的位数; - 对于浮点型
g
或G
,指定精度表示有效数字最大位数; - 对于字符串类型
s
,指定精度表示待打印字符的最大数量; - 对于整型,指定精度表示待打印数字的最小位数,必要时使用前导零。
示例:
printf("%.2f\n",352.4678);
printf("%.2f\n",352.4);
printf("%.4g\n",13.6666);
printf("%.4g\n",13.6);
printf("%.8s\n","periodic table");
printf("%.18s\n","periodic table");
printf("%.4d\n",2643779);
printf("%.10d\n",2643779);
352.47
352.40
13.67
13.6
periodic
periodic table
2643779
0002643779
- 对于一般的浮点型,
#
表示保留小数点; - 对于浮点型
g
或G
,#
表示保留末尾的0
; - 对于八进制整型
o
、十六进制整型x
或X
,#
表示显示相应进制的数字前缀,八进制前缀为0
,十六进制前缀为0x
或0X
。
示例:
printf("%.0f\n",352.47);
printf("%#.0f\n",352.47);
printf("%.5g\n",13.600);
printf("%#.5g\n",13.600);
printf("%x\n",7939);
printf("%#x\n",7939);
352
352.
13.6
13.600
1f03
0x1f03
scanf()
输入
输入格式控制符的基本格式如下:
%[抑制赋值][最大字段宽度][长度][类型]
宽度、长度与类型
最大字段宽度用十进制整数表示;与printf()
输出不同,不能使用字符*
和函数参数。输入达到最大字段宽度处,或第一次遇到空白字符时停止。
示例:
int x;
scanf("%d",&x); printf("%d\n",x);
scanf("%4d",&x); printf("%d\n",x);
scanf("%4d",&x); printf("%d\n",x);
若输入
2643779 2643779
则输出为
2643779
2643
779
输入格式控制符中的长度如下:
修饰符 | 类型 | 含义 |
---|---|---|
无 | 整型 | int 类型 |
无 | 浮点型 | float 类型 |
hh | 整型 | char 类型 |
ll | 整型 | long long (C99) |
h | 整型 | short |
l | 整型 | long |
l | 浮点型 | double 类型 |
L | 浮点型 | long double 类型 |
j | 整型 | intmax_t 或uintmax_t 类型 |
t | 整型 | ptrdiff_t 类型(C99) |
z | 整型 | size_t 类型(C99) |
类型如下:
类型 | 含义 |
---|---|
c | 字符 |
d 或i | 有符号十进制整数 |
e 或E 或f 或F 或g 或G 或a 或A | 浮点数(C99新增a 和A ) |
o | 有符号八进制整数 |
p | 指针(地址) |
s | 字符串(从第一个非空白字符开始,到下一个空白字符之前的所有字符) |
u | 无符号十进制整数 |
x 或X | 有符号十六进制整数 |
[ ] | 结果字符集(从第一个非空白字符开始,到第一个不在字符集内的字符之前的所有字符) |
[^ ] | 定界字符集(从当前字符开始,到第一个在字符集内的字符之前的所有字符。若当前字符在字符集内,则输入为空) |
示例一:
int x;
scanf("%d",&x); printf("%d\n",x);
scanf("%o",&x); printf("%d\n",x);
scanf("%x",&x); printf("%d\n",x);
若输入
7939 17403 1f03
或者
7939 017403 0x1f03
输出的结果都是7939
。
示例二:
double x;
scanf("%le",&x); printf("%f\n",x);
scanf("%lf",&x); printf("%f\n",x);
scanf("%lg",&x); printf("%f\n",x);
scanf("%la",&x); printf("%f\n",x);
若输入
28.597 0.28597e2 0x1.c98d4fdf3b646p4 28.597000
输出的结果都是28.597000
。
事实上,在用scanf()
输入时,e
、E
、f
、F
、g
、G
、a
、A
没有区别。
示例三:
char s[10];
scanf("%[ab]",s); printf("%s\n",s);
scanf("%[^ab]",s); printf("%s\n",s);
scanf("%[a-d]",s); printf("%s\n",s);
若输入
abcd cabcdabef
则输出为
ab
cd c
abcdab
抑制赋值
正常情况下scanf()
会将读取到的内容赋值给参数位置的变量。使用抑制赋值符*
后,scanf()
会照常读取内容,但读取相应的格式控制符的内容后不进行赋值。
示例:
int x;
scanf("%d",&x); printf("%d\n",x);
scanf("%*d%d",&x); printf("%d\n",x);
若输入
15 26 37
则输出为
15
37