第二章 数据类型、运算符与表达式
数据类型
常量与变量
不同类型数据间的转换
运算符和表达式
§ 2.1 数据类型
?数据类型总表
< >
C




基本类型
构造类型
指针类型
空类型 void
定义类型 typedef
字符类型 char
枚举类型 enum
整 型
实型
单精度型 float
双精度型 double
数组
结构体 struct
共用体 union
短整型 short
长整型 long
整型 int
数据类型决定:
1,数据占内存字节数
2,数据取值范围
3,其上可进行的操作













C
?基本数据类型
< >
类型 符号 关键字 数的表示范围所占位数









(signed)int 16 -32768~32767
(signed)short 16 -32768~32767
(signed)long 32 -2147483648~2147483647
16unsigned int 0~65535
32 0~4294967295unsigned long
unsigned short 16 0~65535
有 float 32 3.4e-38~3.4e38
有 double 64 1.7e-308~1.7e308
有 char 8 -128~127
无 unsigned char 8 0~255
说明,数据类型所占字节数随机器硬件不同而不同,上表以 IBM PC机为例,













C
§ 2.2 常量与变量
?标识符
?定义:用来标识变量、常量、函数等的字符序列
?组成:
?只能由 字母, 数字, 下划线 组成,且第一个字母必须是字母或下
划线
?大小写敏感
?不能使用关键字
?长度:最长 32个字符
?命名原则:
?见名知意
?不宜混淆 如 l与 I,o与 0
例,判断下列标识符号合法性
sum Sum M.D.John day Date 3days
student_name #33 lotus_1_2_3
char a>b _above $123
< >
M 3da
#33
$123a>b













C
?一般用大写字母
?是宏定义预处理命令,不是 C语句
?直接常量,
?整型常量
?实型常量
?字符常量
?字符串常量
如 #define PRICE 30
?常量
?定义:程序运行时其值不能改变的量(即常数)
?分类,
?符号常量,用标识符代表常量
?定义格式,#define 符号常量 常量
>
>
>
>
< >
例 符号常量举例 (ch2_1.c)
#define PRICE 30
main()
{
int num,total;
num=10;
total=num*PRICE;
printf("total=%d",total);
}
运行结果,total=300













C
?整型常量(整常数)
?三种形式:
?十进制整数:由数字 0~9和正负号表示,如 123,-456,0
?八进制整数:由数字 0开头,后跟数字 0~7表示,如 0123,011
?十六进制整数:由 0x开头,后跟 0~9,a~f,A~F表示,
如 0x123,0Xff
<
例 12 与 12L例 30000 为 int型65536 为 long int 型
?整型常量的类型
?根据其值所在范围确定其数据类型
?在 整常量后加字母 l或 L,认为它是 long int 型常量
问题:
0123 = ( )10
0x123 = ( )10
0Xff = ( )10
83
291
255
问题:
0123 = ( )10
0x123 = ( )10
0Xff = ( )10













C
?实型常量(实数或浮点数)
?表示形式:
?十进制数形式:(必须有小数点) 如 0.123,.123,
123.0,0.0,123.
?指数形式:( e或 E之前必须有数字;指数必须为整数)
如 12.3e3,123E2,1.23e4,e-5,1.2E-3.5
<
?实型常量的类型
?默认 double型
?在 实型常量后加字母 f或 F,认为它是 float 型













C
?字符常量
?定义,用 单引号 括起来的单个 普通字符 或 转义字符,
?字符常量的 值,该字符的 ASCII码 值
<
转义字符及其含义:
转义字符 含义
\n
\v
\r
\a
\?
\ddd
\t
\b
\f
\\
\“
\xhh
转义字符 含义
换行
垂直制表
回车
响铃
单引号
3位 8进制数代表的字符
水平制表
退格
换页
反斜线
双引号
2位 16进制数代表的字符
如 ‘ \101? -----------?A? ?\012? -----------?\n?
?\376? -----------??? ?\x61? -----------?a?
?\60? -----------?0? ?\483? ----------(?)
例,
?A?-------?\101?-------?\x41?--------65
<
如 ‘ A?——65,‘ a?——97,
‘ 0?——48,?\n?——10
如 ‘ a? ?A? ??? ?\n? ?\101?
?转义字符,反斜线后面跟一个字符或一个代码值表示
例 转义字符举例 (ch2_001.c,ch2_004.c)
main()
{
printf("\101 \x42 C\n");
printf("I say:\"How are you?\"\n");
printf("\\C Program\\\n");
printf("Turbo \'C\'");
}
运行结果,(屏幕显示 )
A B C
Isay:”How are you?”
\C Program\
Turbo ?C?
例 main()
{ printf(“Y\b=\n”);
}
运行结果:
屏幕显示,=
打印机输出,¥
<
?字符常量与字符串常量不同
?字符串常量
?定义:用双引号 (“”)括起来的字符序列
?存储,每个字符串尾 自动 加一个 ‘ \0’ 作为字
符串结束标志
h e l l o \0例 字符串, hello”在内存中
a a \0例 ‘ a?,a”
例 空串,” \0
例, char ch;
ch=“A”;
例, char ch;
ch=?A?;













C
编译程序根据变量定义为其
分配指定字节的内存单元 …...
地址
int a=1,b=-3,c;
a
b
c
2字节
2字节
2字节
地址
地址
…...
内存
1
-3
??
随机数
?变量
?概念:其值可以改变的量
?变量名 与 变量值
?变量定义的一般格式:
数据类型 变量 1[,变量 2,…,变量 n];
< >
?变量初始化,定义时赋初值 例,
int a,b,c;
float data;
决定分配字节数
和数的表示范围
合法标识符 例,
int a=2,b,c=4;
float data=3.67;
char ch=?A?;
int x=1,y=1,z=1;
int x=y=z=1;
?变量的使用,先定义,后使用
例 1
int student;
stadent=19; //Undefined symbol ?statent? in function main
例 2
float a,b,c;
c=a%b; //Illegal use of floating point in function main
?变量定义位置,一般 放在函数开头
main()
{ int a,b=2;
float data;
a=1;
data=(a+b)*1.2;
printf(“data=%f\n”,data);
}
变量定义
可执行语句
main()
{ int a,b=2;
a=1;
float data;
data=(a+b)*1.2;
printf(“data=%f\n”,data);
}
Ch2_005.c













C
?整型变量
?占字节数随机器不同而不同,一般占一个机器字
?short≤int≤long
?可用 sizeof(类型标识符)测量
?实型变量
?float,占 4字节,提供 7位有效数字
?double,占 8字节,提供 15~16位有效数字
?字符型变量
?字符变量存放字符 ASCII码
?char与 int数据间可进行算术运算
例 float a;
a=111111.111; /* a=111111.1*/
double b;
b=111111.111; /* b=111111.111*/
例 a=?D?; /* a=68; */
x=?A?+5; /* x=65+5; */
s=?!?+?G? /* s=33+71; */< >
没有 字符串变量,用字符数组存放
Ch2_006.c













C
例 /*ch2_003.c*/
#define PRICE 12.5
main()
{ int num=3;
float total;
char ch1,ch2=?D?;
total=num*PRICE;
ch1=ch2-?A?+?a?;
printf(“total=%f,ch1=%c\n”,total,ch1);
}
宏定义
变量定义
输出结果
运行结果:
total=37.500000,ch1=d













C
§ 2.3不同类型数据间的转换
?隐式转换
?什么情况下发生
?运算转换 ------不同类型数据混合运算时
?赋值转换 ------把一个值赋给与其类型不同的变量时
?输出转换 ------输出时转换成指定的输出格式
?函数调用转换 ------实参与形参类型不一致时转换
?运算转换规则,不同类型数据运算时先 自动 转换
成同一类型
< >













C
double float
long
unsigned
int char,short低
高 说明,
必定的转换
运算对象类型不同时转换
例 char ch;
int i;
float f;
double d;
ch/i + f*d - (f+i)
int
int
double
double
double
double
double
double
int
int
double
double
double
double
double
double
10+?a? +i*f - d/l
例 int i;
float f;
double d;
long l;
< >
?显式转换(强制转换)
?一般形式,( 类型名 ) ( 表达式)
例 (int)(x+y)
(int)x+y
(double)(3/2)
(int)3.6
?说明:强制转换得到所需类型的中间变量,原变
量类型不变例 main()
{ float x;
int i;
x=3.6;
i=(int)x;
printf(“x=%f,i=%d”,x,i);
}
结果,x=3.600000,i=3
精度损失问题
较高类型向较低类型转换时可能发生
< >
Ch2_007.c
Ch2_008.c













C
§ 2.4 运算符和表达式
C



算术运算符:( + - * / % ++ --)
关系运算符:( < <= == > >= !=)
逻辑运算符:((! && ||)
位运算符,( << >> ~ | ^ &)
赋值运算符:( = 及其扩展)
条件运算符:(?:)
逗号运算符:(,)
指针运算符:( * &)
求字节数,( sizeof)
强制类型转换:(类型)
分量运算符:(, ->)
下标运算符:( [])
其它,( ( ) -)
< >













C
?学习运算符应注意:
?运算符功能
?与运算量关系
?要求运算量个数
?要求运算量类型
?运算符优先级别
?结合方向
?结果的类型
< >













C
?算术运算符和表达式
?基本算术运算符,+ - * / %
?结合方向:从左向右
?优先级,- ---->* / % -----> + -
(2) (3) (4)
说明:
?? -? 可为 单目 运算符时,右结合性
?两整数相除,结果为整数
?%要求两侧均为整型数据
例 5/2 =
-5/2.0 =
例 5%2 =
-5%2 =
1%10 =
5%1 =
5.5%2
< >
例 5/2 2
-5/2.0 = -2.5
例 1
- -1
1
0
(?)













C
?自增、自减运算符 ++ --
?作用:使变量值加 1或减 1
?种类:
?前置 ++i,--i (先执行 i+1或 i-1,再使用 i值)
?后置 i++,i-- (先使用 i值,再执行 i+1或 i-1)
例 j=3; k=++j;
j=3; k=j++;
j=3; printf(“%d”,++j);
j=3; printf(“%d”,j++);
a=3;b=5;c=(++a)*b;
a=3;b=5;c=(a++)*b;
< >
//k=4,j=4
//k=3,j=4
//4
//3
//c=20,a=4
//c=15,a=4













C
?自增、自减运算符 ++ --
?作用:使变量值加 1或减 1
?种类:
?前置 ++i,--i (先执行 i+1或 i-1,再使用 i值)
?后置 i++,i-- (先使用 i值,再执行 i+1或 i-1)
?说明:
?++ -- 不能用于常量和表达式,如 5++,(a+b)++
?++ --结合方向,自右向左
?优先级,- ++ -- ------>* / % ----->+ -
(2) (3) (4)
例 -i++ ? -(i++)
i=3; printf(“%d”,-i++); //-3例 j+++k; (j++)+k;例 -i++i=3; printf(“%d”,-i++);
Ch2_009.c













C
?赋值运算符和表达式
?简单赋值运算符
?符号,=
?格式,变量标识符 =表达式
?作用:将一个数据(常量或表达式)赋给一个变量
?复合赋值运算符
?种类, += -= *= /= %=, =, = &= ^= |=
?含义,exp1 op= exp2 ? exp1 = exp1 op exp2
a+=3 a=a+3
x*=y+8 x=x*(y+8)
x%=3 x=x%3
< >
例 a=3;
d=func();
c=d+2;













C
?说明,
?结合方向,自右向左
?优先级, 14
?左侧必须是变量,不能是常量或表达式
?赋值表达式的值与变量值相等,且可嵌套
?赋值转换 规则,使赋值号右边表达式值 自动 转换成其左边
变量的类型
例 3=x-2*y;
a+b=3;
例 float f;
int i;
i=10;
f=i;
则 f=10.0
例 int i;
i=2.56; //结果 i=2;
例, a=b=c=5
a=(b=5)
a=5+(c=6)
a=(b=4)+(c=6)
a=(b=10)/(c=2)
< >
//表达式值为 5,a,b,c值为 5
// b=5;a=5
//表达式值 11,c=6,a=11
//表达式值 10,a=10,b=4,c=6
//表达式值 5,a=5,b=10,c=2













C
?说明,
?结合方向,自右向左
?优先级, 12
?左侧必须是变量,不能是常量或表达式
?赋值表达式的值与变量值相等,且可嵌套
?赋值转换 规则,使赋值号右边表达式值 自动 转换成其左边
变量的类型
例, a=12;
a+=a-=a*a
例, int a=2;
a%=4-1;
a+=a*=a-=a*=3;
< >
//a=-264 等价于 a=a+(a=a-(a*a))
//a=0 等价于 a=a+(a=a*(a=a-(a=a*3)))













C
?逗号运算符和表达式
?形式,表达式 1,表达式 2,…… 表达式 n
?结合性,从左向右
?优先级, 15
?逗号表达式 的值:等于表达式 n的值
?用途,常用于循环 for语句中
例 a=3*5,a*4
a=3*5,a*4,a+5
例 x=(a=3,6*3)
x=a=3,6*a
例 a=1;b=2;c=3;
printf(“%d,%d,%d”,a,b,c);
printf(“%d,%d,%d”,(a,b,c),b,c);
< >
//a=15,表达式值 60
//a=15,表达式值 20
//赋值表达式,表达式值 18,x=18
//逗号表达式,表达式值 18,x=3
//1,2,3
//3,2,3













C
?逗号运算符和表达式
?形式,表达式 1,表达式 2,…… 表达式 n
?结合性,从左向右
?优先级, 15
?逗号表达式 的值:等于表达式 n的值
?用途,常用于循环 for语句中
例,
/*ch2_6.c*/
#include <stdio.h>
main()
{ int x,y=7;
float z=4;
x=(y=y+6,y/z);
printf("x=%d\n",x);
}
运行结果,x=3
< >













C