第二章 数据描述与基本操作
整型
基本类型 实型 (浮点型 )
字符型
枚举类型
数据类型 数组类型
构造类型 结构类型
联合类型
指针类型 文件类型
空类型
单精度
双精度
一、数据类型
短整型
整型
长整型
计算机中数的表示
1、定点数, 所有的位都表示数值。
( 1)最高位表示符号的叫有符号数。
( 2)所有位表示大小的叫无符号数。
2、浮点数:一部分位表示尾数部分,一部分
位表示指数部分。
C语言中,所有整数都用定点数表示,所有实
数都是浮点表示。
1,C中数据的浮点表示
3.14159× 105 3.14159 e +5
3.14159× 10-5 3.14159 e -2
尾数 指数
2、字符类型数据的表示
C中的字符数据是以 ASCII码存放的。如,a”
的 ASCII值为 97,则内存中表示如下,如
同存放整数一样,因此在 ASCII范围内,
字符与整数是等价的。
例 2-1, 2-2
0 1 1 0 0 0 0 1
3、数据的长度与取值范围
长度 精度 范围
char 1B -128-127
short 2B -32768~32767
long 4B -2147483648~2147483647
float 4B 6位 ± (3.4E-38~3.4E+38)
double 8B 16位 ± (1.7E-308~1.7E+308)
4、整数的有(无)符号
在整型数据说明前加或不加 signed均表示有
符号数,加 unsigned表示无符号数。无符号
数最大值比有符号数大一倍。
长度 范围
unsigned char 1B 0-255
unsigned short 2B 0~65535
unsigned long 4B 0~4294967295
测试数据类型的运算符,sizeof( )
二、常量和变量
1、直接常量和符号常量
? 直接常量:即常数。如 123, ‘ a? 等。
? 符号常量:用指定的名称代替一个常量。
? C中符号常量的定义,
#define 常量名 取值
注意,符号常量在程序中不能重新赋值。
2、直接常量的书写格式
?整型常量:以 0开头的数值作为八进制,以 0X
开头的为十六进制。常量后加 L表示长整型。
?实型常量:只能用十进制表示。
?字符常量:用单引号括起来的一个字符。
?转义字符:以,\”开头,后跟一个字母代表一个
控制字符 ;\\表示,\”本身; \?表示单引号; 1-3
个八进制数表示 ASCII码为该八进制数的字符 ;\x
后跟 1-2个十六进制数表示 ASCII码为该十六进
制数的字符。
例 2-7
main( )
{char ch;
ch=?\362?;
printf (, %c,,ch );
}
结果,≥
( 362) 8 =( 242) 10
查 ASCII表可知是,≥”
\101 或 \x41 表示:‘ A?
\010 或 \x08 表示,\b
\134 或 \x5C表示,\\
\012 或 \x0A 表示,\n
?字符串常量,
字符串常量:用,”括起来的零个或多
个字符序列,中字符串常数。
?字符串的长度:比实际长度大 1。如,Hello”
在内存中表示为,
H e l l o \0
104 101 108 108 111 0
实际存储格式为:,\0”表示“空操作”,只起标记作

注意 ‘ A?与,A”的区别
3、变量和对变量的赋值
?变量:其值可变的量叫变量,变量有一
个名字 ——变量名;变量是对数据及其
存储空间的抽象,数据是变量的 值,存
储空间是变量的 地址 (变量声明后,在
编译时会自动给每一个变量分配一定的
存储空间) 。
?变量的赋值:向变量所代表的存储单元
送数据,由赋值语句完成,
变量 =表达式
例 address.c
关于赋值语句的说明
?“=”不是“等号”。
?赋值运算方向:自右向左。
?C中将赋值的式子叫赋值表达式,所以可以
将赋值表达式(的值)再赋给变量。
?如,b=a=3+5; 结果,b=8
?同样,d=c=b=a=3+5; 则 d,c,b,a均为 8。
( 例 L2-7-2)
4、变量的声明
?C中变量在使用前必须声明。
?同一变量在同一程序中只能声明一次。
?允许在声明变量的同时,给变量赋初值。
?如,int a=23,b=12;
float x=12.3;
char ch=?y?;
5、标识符
?标识符:是给程序中的实体 ——变量、常
量、函数、数组、结构体以及文件等所取
的 名字 。
?标识符命名规则,
?字母或下线开头,后可跟字母、数字、下线。
(但一般尽量不用下线开头的标识符)
?用户定义的标识符不能与系统关键字(参见
P351附录 II)相同。
?Turbo C的标识符有效长度为 31个字符。
?大小写敏感。
对用户定义标识符的建议
?尽量做到“见名知义”。
?如,name,age,month,day,year等。
?变量名、函数名用小写,符号常量用大写。
?尽量避免使用易混淆的字符,
?如,l( L的小写) 与 I( i的大写) 与 1
?再如,0(零 ) 与 o/O(字母 O)
练习
?判断以下用户标识符的合法性,
?number-of-moves
?number_of_moves
?number of money
?5men
?_pic
?$pp
?pp$
?pp%
?else
×

×
×
×
×
×
×
×
三、运算符与表达式
? C的运算符共有 13类,
1,算术运算符,+,-,*, /,%, ++,- -
2,关系运算符,>, <,= =,>=,<=,!=
3,逻辑运算符:!,&&,||
4,位运算符,<<,>>,~,|,^,&
5,赋值运算符,=
6,条件运算符:?,
7,逗号运算符:,
8,指针运算符,*,&
9,求字节数运算符,sizeof()
10,强制类型转换运算符,(类型 )
11,分量运算符,., ->
12,下标运算符,[ ]
13,其它运算符。
学习运算符时的注意事项
?运算符的功能。
?与运算量的关系,
?要求运算量的个数
?要求运算量的类型
?运算的优先级别
?结合方向
?结果的类型
见附录 III 见附录
1、算术运算
?双目算术运算符, *,/,+,-,%
?优先级,*,/, %同级,+,-、同级,且前者
优先于后者。
?结合方向:均为自左向右结合。
?自反算术赋值运算(复合赋值运算),
?- =, + =,* =,/=,%=,自反减、加、乘、除、
取余赋值。
?如,a+=b → a=a+b
?结合方向:均为自左向右结合。
?例 L2-7-3
?自加、自减运算, + +,- -
?如,i=1;
i++; → i=i+1;
?结合方向:自右向左。
?有两种情况
?后缀形式,a++ 先用后加。
?前缀形式,++a 先加后用。
?运算对象只能是数值型变量(一般为整型变
量),不能是表达式或常量。
?例 L2-7-4
?正负号运算, 是一元运算,结合方向为自右
向左,优先级高于 *,/。
赋值类运算符的副作用及限制
?费解、易误解 —对于人的副作用
?例 1,c=b*=a+2 → c=b=b*(a+2)
?例 2,x=i+++j → x=(i++)+j (从左至右取大优先)
?措施,
?分解:例 1 可分解为,a=a+2 ; b=b*a ; c=b;
?加括号:例 2 可写为,x=(i++)+j
?加注释:进行适当的说明。
?例 L2-7-5
?不定解 —对于机器的副作用
?j=3; i=(k=j+1)+(j=5); 在 Turbo c 2.0上是 11
2、关系运算、逻辑运算与条件运算
? 关系运算,
? 关系运算符,>, <,= =,>=,<=,!=
? 优先级高于赋值运算、低于算术运算。
? 关系运算表达式的值只有两个,
? 表达式成立:结果为真( 1)
? 表达式不成立:结果为假( 0)
? 结合方向:自左向右。
? 例 L2-7-6
关系运算的注意事项
?要说明一个 x在某个区间,可用“与” &&表
示。
x>=2 && x<=10;
?表达式,5>2>7>8在 C中是允许的,结果为 0。
?由于关系表达式的结果为 1或 0,因此,可
将其看作是上种整型表达式。
?字符的比较是按 ASCII码值来进行比较的。
?由于存储上的误差,一般应该避免两个浮
点数的比较。
?例 L2-7-7
?逻辑运算
?C中常用的三个基本逻辑运算符,&&,||,!。
?结合方向,&&与 ||为自左向右,!为自右向左。
a
a
a
b
b
&&
||
!
真值表
数据 a 数据 b !a !b a && b a || b !(a && b)
T T F F T T F
T F F T F T T
F T T F F T T
F F T T F F T
例 L2-8
?一点 a(x,y)落在上图的阴影部分 (不压线 )的 C条件表
达式为,
2
-2 2
-2
-1
-1 1
1
-2 < x & & x < 2 & & - 2 < y & & y < 2 & & ( x * x + y * y > 1)
练习,L2-8-2
写出一个整数 x满足以下条件的 C表达式。
1、能被 2整除。
2、不能被 3整除。
3、能被 5整除,也能被 7整除。
4、能被 5整除,但不能被 7整除。
5、写出润年的判别式。
x %2= = 0
x %3!= 0
x %5 = = 0 && x%7= = 0
x %4 = = 0 && x%100!= 0 | | x % 400= =0
x %5 = = 0 && x%7! = 0
逻辑运算的注意事项
?在一个 &&表达式中,若 &&的一端为 0,则结果为 0,
而不必再计算另一端,由于 C中是自左向右结合,
因而,只要左端的为 0,则右端不再处理。
?例 L2-8-2
?在一个 ||表达式中,若 ||的一端为 1,则结果为 1,
而不必再计算另一端,由于 C中是自左向右结合,
因而,只要左端的为 1,则右端不再处理。
?例 L2-8-3
?条件运算
?是 C中惟一的三元运算符。
?格式,e 1? e 2, e 3
?操作过程:如果 e1的值为真(非 0),则该条
件表达式的值为 e2的值,否则为的 e3值,
?例 L2-9,L2-10
四、不同数据类型的转换
?数据类型转换原则,按位转换。
?长位向短位转换:低端对齐,高端截除。
?短位向长位转换:低端对齐,高端按扩展。
?Signed类型:高端按符号位扩展。
?unsigned类型:高端按零扩展。
?实型转换为整型:舍去小数部分。
?double 转换为 float:按六位精度四舍五入。
?算术转换,
?将短数扩展为机器处理的长度处理。
?使运算符两端具有共同的类型。
?强制转换,
(类型标识符) 表达式
五、输入输出函数
?printf (格式控制参数,输出项 1,输出项 2,…… )
?格式控制字符串的格式,
% - 0 m.n l 格式字符
?scanf (格式控制参数,地址 1,地址 2,…… )
?格式控制字符串的格式,
% * m l 格式字符
?
scanf()函数与输入缓冲区
?在输入数据时,
?输入的一行字符串在按回车符之前存放在缓冲
区中;
?按回车之后,逐个送入变量对应的地址;
?输入数据多于一个 scanf()函数所要求的个数,
余下数据继续为后续 scanf()函数所用。
例 L2-19
( 第二次运行时,可用 DOS编辑键快速输入上次
已输入的数据 )
附,DOS编辑键
编辑键 功能
光标右键 → 从样板行中复制光标对应处的一个字符
光标左键 ← 取消光标左边的一个字符
F1同 → 同 →
F2 从样板行中复制指定字符前的所有字符
F3 从样板行中复制光标对应处开始的所有字符
习题 2-26
scanf("%2d%f%*d%f%c%d",&i,&x,&y,&c,&j);
?main()
?{
? int i,j;
? float x,y;
? char c;
? clrscr();
? scanf("%2d%f%*d%f%c%d",&i,&x,&y,&c,&j);
? printf("i=%d x=%f y=%f c=%c j=%d\n",i,x,y,c,j);
? getch();
?}
getch()函数与 putch()函数
? getchar()函数:从标准设备上读入一个字符。
? putchar()函数:向标准设备上输出一个字符。
? 说明,
? 所有字符输入完,按回车后,才将该行字符逐一取出字符给变量。
例 L2-20
? 可用 putch(getch( ) )形式,读入一个字符后直接送到屏幕上。
例 L2-21