第 2章 数据类型、运算符与表达式
2.1 C的数据类型
2.2 常量与变量
2.3 整形数据
2.4 实型数据
2.5 字符型数据
2.7 各类数值型数据间的混合运算
2.6 变量赋初值
2.8 算术运算符与算术表达式
2.9 赋值运算符和赋值表达式
2.10 逗号运算符和逗号表达式
第 2章 数据类型、运算符与表达式
2.1 C的数据类型
1.一个 C程序包括的内容
程序 =算法 +数据结构 +程序设计方法 +语言工具和环境
2,C的数据类型
数据类型
基本类型
构造类型
指针类型 (?)
空类型 (void)
字符型 (char)
数值类型
枚举类型 (enum)
数组类型 ([ ])
结构体类型 (struct)
共用体类型 (union)
整型 (short,int,long,unsigbed)
实型 单精度型 (float)双精度型 (double)
2.2 常量与变量
1.常量和符号常量
在程序运行过程中其值不能被改变的量称为 常量 。
例 2.1 定义符号常量。
#define PRICE 30
main( )
{ int num,total;
num=10;
total=num?PRICE;
printf(“total=%d”,total);
}
用 define命令定义 PRICE代表常量 30,则在整个程序
中出现的 PRICE都代表 30,可以和常量一样进行运算。
2.变量
在程序运行过程中其值可以被改变的量称为 变量 。
变量名由字母、数字和下划线三种字符组成,由字母
开头,且只识别前 8个字符。
如,sum,aver,class,day均为合法变量名; $123,
#33,3ds均为非法变量名;而 filename,filename1以及
filename2 表示同一个变量名。
? sum,Sum与 SUM是三个不同的变量名。
?在 C中,习惯用大写字母标识符号常量,用小写字
母标识变量。
?变量必须先定义后使用 。
?变量一经定义,就确定了类型。
2.3 整型数据
1,整型常量
整型常量即整常数。整常数有三种表示形式:
?十进制数 如,123,- 456
?八进制数 以 0开头。如,0123,- 011
?十六进制数 以 0x开头。如,0x123,- 0x12
2.整型常量的类型
?其值在 -32768~+32767时为 int型。
?其值在 -2147483648~+214748647时为 long int型。
?常量中无 unsigned型。但非负值的整型量可以赋值给
unsigned型整变量,只要不产生溢出。
?在整型常量后面跟一个字母 l 或 L,则认为是 long int
型常量。
3.整型变量
1) 整型变量的分类
?基本型 以 int表示。 -32768~32767 (-215~215 -1)
?短整型 以 short int或 short表示,取值范围同 int型。
?长整型 以 long int或 long表示。
-2147483648~2147483647 (-231~231-1 )
?无符号型 用全部二进制位 (bit)存放数据,不能存放负数 。
unsigned int与 unsigned short,0~65535(0~216-1)
unsigned long, 0~4294967295 (0~232 -1)
2) 整型变量的定义
int a,b;
unsigned short c,d;
long e,f ;
2.4 实型数据
1,实型常量
?十进制数形式,0.123,.123,123,123.0,… 。
?指数形式,123e3或 123E3都代表 123 ?103。
2,实型变量
单精度 float:占用 4 Bytes,7位有效数字,10–38 ~1038 。
双精度 double,占用 8 Bytes,15/16位有效数字,
10–308~10308 。
如,float x,y; /? 只能接收 7位有效数字 ?/
double z;
2.5 字符型数据
1.字符常量
字符常量是用单引号括起的 1个字符。如:‘ a?、‘ A?,… 。
以,\”开头的字符序列在 printf 函数中控制输出格式。
1到 2位 16进制数所代表的字符\xhh
1到 3位 8进制数所代表的字符。如:‘ \101?=?A?\ddd
单引号 ’\?
反斜杠字符 \\\
走纸换页\f
回车\r
退格\b
竖向跳格\v
横向跳格(下一个输出区 < 8列 >)\t
换行\n
例 2.2 输出格式控制
在打印机上输出,
f ? a b? c ?? gde
h?????? j i ?? k
在屏幕上输出,
f ??????? gde
h?????? j??? k
2.字符变量
字符变量只能存放 1 个字符
main( )
{ printf(“?? ab? c\t? de\rf \tg\n”);
printf(“h\ti\b\bj??? k”);
}
char c1,c2;
c1=?a?; c2=?b?;
表示空格符
3,字符数据在内存中的存储形式及使用方法
在 C中, 字符型数据与整型数据可以相互赋值和运算 。
例 2.3
main( )
{ char c1,c2;
c1=?a?; c2=?b?;
printf(“%c %c\n”,c1,c2);
c1=c1–32; c2= c2–32;
printf(“%c %c\n”,c1,c2);
c1=97; c2=98;
printf(“%c %c\n”,c1,c2);
c1=c1–32; c2=c2–32;
printf(“%c %c\n”,c1,c2);
}
输出结果:
a b
A B
a b
A B
4,字符串常量
字符串常量是用双引号括起来的字符序列。
如:,How do you do.”,“CHINA”,“a”,“$123.45”
注意,
? ?a?是字符常量,而,a”是字符串常量。
?不能将一个字符串赋给一个字符变量。字符串
其内部有结束标志‘ \0?。
? C中没有字符串变量,需要用字符数组存放字
符串。
2.6 变量赋初值
C规定,可以在定义变量的同时给变量赋初值。如:
int a=3;
float f =3.56;
char c=?a?;
int a,b,c=5; /? 只给 c赋初值 ?/
int a=3,b=3,c=3; /? 不能写成 int a=b=c=3 ?/
2.7 各类数值型数据间的混合运算
整型, 单精度型, 双精度型数据可以混合运算 。
不同类型的数据要先转换成同一类型, 然后进行运算 。
转换规则如图:
注,
箭头只表示转换方向,并
不是依次转换。 转换过程
是自动完成的 。
例,10 + ?a? + i ? f - d/e
运算过程为:
??a?转换成整数 97与 10相加, 结果为 107 ;
? i 和 f 转换成 double型, 运算结果为 double型;
?将 107转换成 double型与 i和 f的积相加, 结果为
double型;
?将 e转换成 double型, d/e的结果为 double型;
? 10 + ?a? + i ? f 的结果与 d /e的商相减, 结果为
double型 。
2.8 算术运算符和算术表达式
1,C 运算符简介
在 C中,除了控制语句和输入输出以外的基本操作
都作为运算符处理。
C的运算符有如下几类:
?算术运算符 +,–,?,/,%
?关系运算符 >,<,> =,< =,= =,! =
?逻辑运算符 &&,||,!
?位运算符 ~, <<,>>,|,?,&
?赋值运算符 =,+=,-=,?=,/=,%=
?条件运算符?,
?逗号运算符,
?指针运算符 ? 和 &
?求字节数运算符 sizeof
?强制类型转换运算符 (类型 )
?分量运算符 ? 或 - >
?下标运算符 [ ]
?其它 如函数调用运算符 ( )
C中各类运算符的优先级:
初等运算符 ( ),[ ],?
单目运算符 !,++,––,+, –, (类型 )
算术运算符 ?,/, %, +,–
关系运算符 <,>,<=,>=, ==,!=
逻辑运算符 &&,||
条件运算符?,
赋值运算符 =,+=,–=,?=,/=,%=
逗号运算符,
2.算术运算符和算术表达式
1) 基本的算术运算符
+, –, ?, /, %
% 为求余、模运算 ( %的两边必须为整型数据 )
其中:在除法中,整数相除取整,且大多数机器采
取,向零取整,方法,即取整后向零靠拢。实数相除
为 double型。
如,5/3=1,-5/3= -1,5/3.0=1.66666666666667。
2) 算术表达式和运算符的优先级与结合性
算术表达式是用算术运算符和括号将运算对象 (常量、
变量、函数等 )连接起来的、符合 C语法规则的式子。
C的各种运算符的结合性为, 自左向右, 。
3,强制类型转换
当自动类型转换不能达到目的时,可以用强制类型
转换。强制类型转换运算符可以将一个变量或一个表达
式转换成所需的类型。 如:
(double)a 将 a 转换成 double 类型
(int)(x+y) 将 x + y 的值转换成 int 型
(float)(5%3) 将 5 % 3的值转换成 float类型
例 2.4 main( )
{ float x;
int i;
x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i);
}
运行结果:
x=3.600000,i=3
4,自增、自减运算符
自增、自减运算符的作用是使变量的值增加 1或减少 1。
++i,--i i 的值 先增加 (减少 ) 1,然后 再使用 i。
i++,i-- 先使用 i 的值,然后 i 再增加 (减少 )1。
注意,
? ++和 --只能用于变量,不能用于常量和表达式。
? ++和 --的结合方向“自左至右”。如,-i++相当于 -(i++)。
? i+++j按,自左向右,的原则解释为 (i++)+j,而不是 i+(++j)。
? printf(“%d,%d”,i,i++),若“自左至右”,则为,3,3”;
若“自右至左,,则为,4,3”。 Turbo C和 MS C遵循
自右至左,原则(包括函数调用时参数表中变量的求
值顺序也是如此)。
① 若 i=3; j=++i; 则 j的值为 4,i 的值为 4。
② 若 i=3; j=i++; 则 j是值为 3,i 的值为 4。
③ 若 i=3; k=(i++)+(i++)+(i++); 则 k的值为 9,i 的值为 6。
③ 可以解释为:
i=3;
k=i+i+i;
i++; i++; i++;
④ 若 i=3; k=(++i)+(++i)+(++i); 则 k为 18,i 的值为 6。
④ 可以解释为:
i=3;
++i; ++i; ++i;
k=i+i+i;
2.9 赋值运算符和赋值表达式
?,=,的作用是将一个数据或一个表达式赋给其左边的变量。
?若,=,两边的类型不一致,当同为数值型或字符型时,在赋值
时要进行类型转换。
1) 将实型数据赋给整型变量时,舍弃实数的小数部分。
2) 将整型数据赋给实型变量时,其数值不变,但以浮点数形式存储。
3) 将字符型数据赋给整型变量时,由于字符只占 1个字节,而整型
变量占 2个字节,因此,将字符数据放到整型变量的低 8位中。
?将字符处理为 unsigned char时, 高 8位补 0。
如将变量 c (字符 ‘ \376?)赋给整型变量 i 。
?将字符处理为带符号的量时, 高 8位全补 1,称为, 符号扩展, 。
c=?\376? 1 1 1 1 1 1 1 0
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0i,1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 0c=?\376?
i:
1,概述
4) 将带符号的 int型数据赋给 long int型变量时,进行符
号扩展。即将数据送到低 16位中,高 16位补 0或补 1。
5) 将 unsigned int型数据赋给 long int型变量时,不存
在符号扩展问题。
6) 将非 unsigned型数据赋给 unsigned型变量时,原样
照赋。
2,复合的赋值运算
复合赋值 等价于
a+=3 a=a+3
x?=y+8 x=x?(y+8) 不得写成,x=x?y+8
右边是一个整体 。x%=3 x=x%3
x%=y+3 x=x%(y+3) 不得写成,x=x%y+3
在 C中可以使用的复合赋值运算符有:
+=,-=,?=,/=,%=,<<=,>>=,&=,^ =,|=
3.赋值表达式的一般形式
<变量 > <赋值运算符 > <表达式 >
其中:
? <表达式 >又可以是一个赋值表达式。
a = (b=5) a的值为 5
a=b=c=5 a,b,c的值均为 5
a=5+(c=6) a的值为 11
a=(b=4)+(c=6) a的值为 10
a=(b=10)/(c=2) a的值为 5
?赋值表达式可以包含复合的赋值运算符。
a += a -= a?a
若 a=12,则上式的求解步骤为:
?先进行 a-=a?a的运算,即 a=a-a?a=12-144=-132
?再进行 a+=-132的运算,即 a=a+(-132)=-132-132=-264
如:
2.10 逗号运算符和逗号表达式
逗号表达式的一般形式:
表达式 1,表达式 2,……,表达式 n
求解过程为,从左至右 求各表达式的值,结果取 最右边
表达式的值。
如,a=3?5,a?4 表达式值为 60
(a=3?5,a?4),a+5 表达式值为 20
x=(a=3,6?3) x的值为 18
x=a=3,6?a x的值为 3
例 2.5
main( )
{ int m,n;
m=(n=3?5,n?4),n+5 ;
printf(“%d,%d\n”,m,n);
}
运行结果:
60,15
这两个表达式中不存在 n 的赋值
例 2.6
#include“stdio.h”
main( )
{ int i=1;
printf(“%d,%d,%d,%d\n”,i,i++,i++,i++);
}
运行结果:
4,3,2,1
函数调用时,函数参数的求值顺序 从右至左
课外练习:习题册中习题一全部
输出结果怎样?请思考