第 3章 数据类型、运算符与表达式
1.C语言的数据类型
2.基本数据类型
3.变量的赋值
4.C语言定义的各种表达式本章内容空类型数据类型基本类型整型实型(浮点型)
字符型枚举类型构造数据类型数组结构体共用体类型指针类型单精度型双精度型
C语言的数据类型常量与变量常量和符号常量
1.常量(直接常量),
在程序运行时,其值不能被改变的量。
如 0,-3.14159,?a? 等。
2.符号常量:
可以使用一个标识符表示常量。
如,PI 表示 3.14159
C语言中使用宏定义命令 #define来定义。
格式,#define 标识符 常量串例如,#define PI 3.14159
说明:
1)符号常量名常常用大写字母、变量名用小写字母。
2)符号常量不能在其作用域范围内重新赋值。
3,符号常量使程序易于阅读和修改。
例如,一个程序中多处用到人数为 100,当有人数改变为 200,修改这个程序很困难。而使用符号常量,只要将 #define NUM 100 改为 #define NUM 200就可以了。
而在使用时看到 NUM也就知道这是人数。
常量和符号常量在程序中使用的变量名、函数名、标号常量名等统称为标识符。除库函数的函数名由系统定义外,其余都由用户自定义。
1,标识符程序运行时,其值能被改变的量叫变量。
每个变量还必须有一个名字,指明是哪个变量;
程序运行时,计算机给每个变量分配一定的存储空间。
每个变量必须有一个类型,如整型、浮点型等,它指明给这个变量分配适当的存储空间;
一般一个变量还要有值,值放在变量的存储空间内。
变 量
( 1)标识符只能是字母 (A-Z,a-z)、数字 (0-9)、
下划线组成的字符串,
( 2) 必须是字母或下划线开头 。
( 3) 字符之间必须并排书写,不能出现上下标 。
( 4) 不能使用 C语言的保留字符 。
2,C语言标识符的命名规则
以下标识符是合法的:
x,_x3,Student_1,sum5
以下标识符是非法的:
6x AT&T
以数字开头 出现非法字符 &
C语言区分大小写
C语言中使用的变量都要作类型强制定义,即要求,先定义,后使用,的原则 。
其目的,1)编译程序为其分配相应的储存单元
2)保证程序中变量名使用的正确性
3)保证运算的合法性定义形式,类型标识符 变量名列表 ;
如,int x,y;
注 意:
整型数据整型常量在C语言中,使用的整常数有八进制,十六进制和十进制三种 。
1,十进制整常数以下各数是合法的十进制整常数:
123 -123 65535 1627
八进制整常数必须以 0开头,即以 0作为八进制数的前缀。数码取值为 0~ 7。八进制数通常是无符号数。
2,八进制整常数
以下各数是合法的八进制数:
015(十进制为 13) 0101(十进制为 65)
以下各数是不合法的八进制数:
079 08001
前缀为 0X或 0x。 其数码取值为 0~ 9,A~ F或 a~ f。
以下各数是合法的十六进制整常数:
0X2A(十进制为 42) 0XA0 (十进制为 160)
0XFFFF (十进制为 65535)
以下各数不是合法的十六进制整常数:
5A 0X3H
无前缀 0X 含有非十六进制数码
3.十六进制整常数整型变量整型变量基本整型 int 占内存 2B
短整型 short int 或 short 占内存 2B
长整型 long int 或 long 占内存 4B
无符号整型无符号基本整型 unsigned int
无符号短整型 unsigned short
无符号长整型 unsigned long
1.整型变量的分类类型说明符 数的范围 分配字节数
int -32768~32767 2字节
short int -32768~32767 2字节
signed int -32768~32767 2字节
unsigned int 0~65535 2字节
long int -2147483648~2147483647 4字节
unsigned long 0~4294967295 4字节
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
符号位
TC中各类整型量所分配内存字节数及数的表示范围例如:一个整型( int)数据的最大值变量说明的一般形式为:
类型说明符 变量名标识符,变量名标识符,… ;
例如,int a,b,c; (a,b,c为整型变量 )
long x,y; (x,y为长整型变量 )
unsigned int p,q; (p,q为无符号整型变量 )
2,整型变量的说明在书写变量说明时,应注意以下几点:
( 1)允许在一个类型说明符后,说明多个相同类型的变量。各变量名之间用逗号间隔。类型说明符与变量名之间至少用一个空格间隔。
( 2)最后一个变量名之后必须以,;,号结尾。
( 3)变量说明必须放在变量使用之前。一般放在函数体的开头部分。
2,整型变量的说明例
main()
{ int a,b,c,d;
unsigned u;
a=12;b=-24;u=10;
c=a+u; d=b+u;
printf(“a+u=%d,b+u=%d\n”,c,d);
}
程序运行结果:
a+u=22,b+u=-14
3.整型数据的溢出
main()
{ int a,b;
a=32767;
b=a+1;
printf("a=%d,b=%d\n",a,b);
}
运行结果是,a=32767,b= -32768
a,0111111111111111 - > 32767
b,1000000000000000 - > -32768
C语言中,数据超出其存储范围,即“溢出”,不报知错误信息,程序仍然能运行,但可能结果不正确的结果。
小数形式由数码 0~ 9和小数点组成 。 例如,0.0,.25,5.789,
0.13,300.,-267.8230等均为合法的实数 。
指数形式由十进制数,加阶码标志,e”或,E”以及阶码 ( 只能为整数,可以带符号 ) 组成 。 其一般形式为 a E n ( a
为十进制数,n为十进制整数 ) 其值为 a× 10n。
实型数据
1.实型常量实型也称为浮点型。实型常量也称为实数或者浮点数。
在C语言中,实数只采用十进制。
它有二种形式,小数形式与指数形式以下 不是 合法的实数,
345 (无小数点 ) E7 (阶码标志 E之前无数字 )
,-5 (无阶码标志 ) 53.-E3 (负号位置不对 )
2.7E (无阶码 )
如,2.1E5 (等于 2.1× 105),3.7E-2 (等于 3.7× 10-2)
0.5E7 (等于 0.5× 107),-2.8E-2 (等于 -2.8× 10-2)
标准C允许浮点数使用后缀。
后缀为,f”或,F”即表示该数为浮点数,如 356f 。
2.实型变量一般 PC机中单精度型占 4个字节 ( 32位 ) 内存空间,其数值范围为 -3.4E-38~ 3.4E+38,只能提供七位有效数字 。
双精度型占 8个字节 ( 64位 ) 内存空间,其数值范围为
-1.7E-308~ 1.7E+308,可提供 16位有效数字 。
单精度型 float
双精度型 double
实型变量分为两类:
3.实型变量的说明实型变量说明的格式和书写规则与整型相同 。
例如,float x,y; (x,y为单精度实型量 )
double a,b; (a,b为双精度实型量 )
实型变量由于有效数字的限制,可能出现 舍入误差 。
应该避免非常大的数与较小的数进行加减运算 。 比如:
123456.789e5+20的结果因为只能有 7位有效数字 。
4.实型常数不分单、双精度,都按双精度型处理。
1.字符常量字符常量是用单引号括起来的一个字符 。
例如 'a','b','=','+','?'都是合法字符常量 。
在C语言中,字符常量有以下特点:
字符常量只用单引号括起来,不能用双引号或其它括号 。
字符常量只能是单个字符,不能是字符串 。
字符可以是字符集中任意字符 。
字符型数据字符型量字符型量包括字符常量和字符变量。
常用的转义字符及其含义:
\n 回车换行 \t 横向跳到下一制表位置
\v 竖向跳格 \b 退格
\r 回车 \f 走纸换页
\\ 反斜线符,\” \' 单引号符
\ddd 1~ 3位八进制数所代表的字符
\xhh 1~ 2位十六进制数所代表的字符
2.转义字符转义字符是一种特殊的字符常量。
转义字符以反斜线,\”开头,后跟一个或几个字符。
转义字符具有特定的含义,不同于字符原有的意义。
转义字符主要用来表示那些用一般字符不便表示的控制代码。
字符变量的取值是字符常量,即单个字符 。
每个字符变量中只能存放一个字符。
在一般系统中,一个字符变量在计算机内存中占一个字节。
C语言中的字符变量用关键字 char来说明:其形式:
char 变量名列表 ;
例如,char ch,a,b;
3.字符变量字符值存放到一个字符变量中,实际是将字符的 ASCII码值存放在变量的内存单元之中的。如
‘ A?的十进制 ASCII码是 65。
若将字符‘ A?存到内存变量中,实际存放形式是:
0 1 0 0 0 0 0 1
4.字符数据在内存中的存储形式及使用方法在C语言中,字符数据与整型数据可以通用,允许对整型变量赋以字符值,也允许对字符变量赋以整型值 。
在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出 。
整型量为二字节量,字符量为单字节量,当整型量按字符型量处理时,只有低八位字节参与处理 。
说 明:
例如:
main()
{ int a,b;
char c,ch;
c='A'; a=c+32; b=321;
printf("a=%d,b=%d,c=%d\n",a,b,c);
printf("a=%c,b=%c,c=%c\n",a,b,c);
}
0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1变量 b在内存中的存放形式大小写字母的转换
5.字符串常量
a a \0
'a'与 "a"在内存的存储形式
C语言中的字符串常量是由一对双引号括起来的字符序列。每个字符串最后有一结束标志 '\0'。
例如,"ABC","A","123lkdf"
注意,( 1)在 C语言中没有字符串变量。字符串数据是通过字符数组或字符指针变量来处理。
( 2)不要将字符常量和字符串常量混淆。
例如 'a'与 "a"是 C语言中两种完全不同类型的数据。
变量赋初值
C语言中对变量赋初值有两种形式在定义变量时赋初值例,int a=5,n=0;
char ch1,ch2='A';
int a=10,b=10,c=10;
不能写成,int a=b=c=10; ( P53)
先定义变量,然后用赋值运算符赋值例,int a,b;
a=10;b=10;
说明,C语言中变量定义后若没有赋值,系统并不自动清 0,
如果直接使用它,其值将是一个,不确定的数” 。
各类数值型数据间的混合运算变量的数据类型是可以转换的 。
转换的方法有两种,一种是自动转换,一种是强制转换 。
自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成 。
Char,short
floatdouble
long
Unsigned
int低高自动转换遵循以下规则:
1,若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
2,转换按数据 长度增加 的方向进行,以保证精度不降低。如
int型 和 long型运算时,先把 int量转成 long型后再进行运算。
3,所有的浮点运算 都是以双精度进行的,即使仅含 float单精度量运算的表达式,也要先转换成 double型,再作运算。
4,char型和 short型参与运算时,必须先转换成 int型。
各类数值型数据间的混合运算例,i为 int型变量,f为 float型,d为 double型,e为
long型 则 5 + i*f – d / e +?Z? 结果为?型
f一定变为
double型?Z?一定变为 int型结果为 double型
1,C语言运算符简介
C语言中运算符和表达式数量之多,在高级语言中是少见的 。 正是丰富的运算符和表达式使C语言功能十分完善 。 这也是 C语言的主要特点之一 。
运算符的种类
C语言的运算符共有十三类 见 Pg.55 Pg.375
算术运算符和算术表达式
( 1) 运算符的功能;
( 2) 与运算量的关系
1) 要求运算量的个数单目运算 ++,--,&,-
双目运算 +,-,*,%
三目运算?,2)要求运算量的类型
( 3)运算符的优先级别
( 4)运算符的结合性(也称结合方向)
( 5)运算结果的类型
2,学习运算符应注意的几个问题在C语言的表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。
这种结合性是其它高级语言的运算符所没有的,因此也增加了C语言的复杂性。
例,a*b/c 左 右
++,--,& 右 左
2,学习运算符应注意的几个问题
1,C语言的基本算术运算符:
加法 + 减法 - 乘法 *
除法 / 求余 %
其中,1) 求余 %运算要求运算量必为 int;
2) 两个整数相除,结果是整数。
2,算术表达式和运算符的优先级与结合性
( 1)表达式:
C中若写成,1/2*a*t*t 则结果不对应写成,0.5*a*t*t 或则,a*t*t/2
3,算术运算符及其优先级注意:
22ta?
2
ta 2?
( 2)优先级别(见教材 Pg,375)
*,/,% 在 C语言的运算中处于:低于单目运算符(!,++ --等)高于 +,-
(3) 结合方向 左 右
3、强制类型转换运算符一般形式,(类型名)表达式例,(double) y
(int) x+n 不等于 (int)(x+n)
说明:强制类型转换运算符是单目运算符,优先级高于 *,/
结合方向:由右至左自增运算符,++ 其功能是使变量的值自增 1。
自减运算符,- - 其功能是使变量值自减 1。
++,--运算符为单目运算,要求运算对象只能是变量,
结合方向为由右至左 。 优先级:高于 *,/
作用相当于 i= i+ 1和 i= i- 1;
可有以下几种形式:
++i i自增 1后再参与其它运算 。
i++ i 参与运算后,i的值再自增 1。
- -i i自减 1后再参与其它运算 。
i- - i 参与运算后,i的值再自减 1。
4.自增、自减运算符
main()
{
int i=8,y,z;
y=++i;
z=i++;
printf("%d\n“,y);
printf("%d\n",z);
printf("%d\n",++i);
printf("%d\n",i++);
}
9
9
11
11
例:
9
109
5,有关表达式使用中的问题说明 Pg58
求 (i++)+(i++)+(i++)值的问题求 i+++j值的问题
i=3,求 Printf(“%d,%d”,i,i++)的输出结果自增自减运算符只能用于变量,不能用于常量和表达式;
结合方向是自右向左;
-i++ 不表示 (-i)++ 而是 -(i++)
1.赋值运算符和赋值表达式赋值运算符 =。 由赋值运算符连接的式子称赋值表达式 。
一般形式为,变量 = 表达式功能:计算表达式的值再赋予左边的变量 。
例如,x=a+b
w=sin(a)+sin(b)
y =i+++j
赋值运算符的结合方向:由右至左 。
因此 a=b=c=5可理解为,a=(b=(c=5))
优先级:低于条件运算符 (?,),
高于逗号运算符 (,)
赋值运算符和赋值表达式
( 1)在其它高级语言中,称为赋值语句。而在 C中,把,=”
定义为运算符,从而组成赋值表达式。凡是表达式可以出现的地方均可出现赋值表达式。
例如,式子 x=(a=5)+(b=8)是合法的 。 它的意义是把 5赋予 a,8赋予 b,再把 a,b相加,和赋予 x,故 x应等于 13。
( 2) 在C语言中也可以组成赋值语句,按照C语言规定,
任何表达式在其未尾加上分号 ( ; ) 就构成为语句 。 因此如
x=8;a=b=c=5;都是赋值语句 。
( 3) 如果赋值运算符两边的数据类型不相同,系统将自动进行类型转换,即把赋值号右边的类型换成左边的类型 。
说 明:
1) 实型赋予整型,舍去小数部分 。
2) 整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分 (小数部分的值为 0)。
3) 字符型赋予整型,由于字符型为一字节,整型为二个字节,故将字符 ASCII码值放到整型量低八位,高八位由系统决定 。
4) 整型赋予字符型,只把低八位赋予字符量 。
具体规定如下,(书上的八种情况)
main()
{ int a,b=322,c;
float x,y=8.88; char c1=?A',c2;
a=y; x=b; c=c1; c2=b;
printf("a=%d,x=%f,%d,%c",a,x,c,c2);
}
例 如:
a=8,x=322.000000,65,B
在赋值符,=”之前加上其它二目运算符可构成复合赋值符 。
如 +=,-=,*=,/ =,%=,<<=,>>=,&=,^=,|= 。
构成复合赋值表达式的一般形式为:
变量 双目运算符 =表达式它等效于,变量 =变量 运算符 表达式优先级别,仅高于逗号 (,) 运算符例如,a+=5 等价于 a=a+5
x*=y+7 等价于 x=x*(y+7)
r%=p 等价于 r=r%p
复合赋值符的优先级和结合方向与赋值运算符 ( =) 相同 。
3.复合赋值符及表达式
C语言中逗号,,,也是一种运算符,称为逗号运算符。
其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。
其一般形式为,表达式 1,表达式 2,…,表达式 n
其求值过程是分别求表达式 1,表达式 2… 表达式 n的值,
并以最后一个表达式 n的值作为整个逗号表达式的值 。
逗号运算符和逗号表达式
main()
{ int a=2,b=4,c=6,x,y;
y=((x=a+b),(b+c));
printf("y=%d,x=%d",y,x);
}
y=10,x=6
1,逗号运算的优先级是 C语言中所有运算中最低的;
2,程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值;
3.并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只用作各变量之间的间隔符。
例,main()
{ int x,y,z,a;
x=y=z=2;
a=(y++,x=y+10,z+y) ;
printf("%d,%d,%d,%d",x,y,z,a);
}
逗号表达式的说明:
13,3,2,5
1.C的数据类型基本类型,构造类型,指针类型,空类型
2.基本类型的分类及特点类型说明符 字节 数值范围字符型 char 1 C字符集基本整型 int 2 -32768~ 32767
短整型 short int 2 -32768~ 32767
长整型 long int 4 -214783648~ 214783647
无符号型 unsigned 2 0~ 65535
无符号长整型 unsigned long 4 0~ 4294967295
单精度实型 float 4 1.0E-38~ 1.0E+38
双精度实型 double 8 1.0E-308~ 1.0E+308
小 结
3.常量后缀
L或 l 长整型 U或 u 无符号数 F或 f 浮点数
4.常量类型整数,长整数,无符号数,浮点数,字符,字符串,
符号常数,转义字符 。
5.数据类型转换自动转换在不同类型数据的混合运算中,由系统自动实现转换,
由少字节类型向多字节类型转换 。
不同类型的量相互赋值时也由系统自动进行转换,把赋值号右边的类型转换为左边的类型 。
强制转换由强制转换运算符完成转换 。
小 结
6.运算符优先级和结合性一般而言,单目运算符优先级较高,赋值运算符优先级低 。
算术运算符优先级较高,关系和逻辑运算符优先级较低 。
多数运算符具有左结合性,单目运算符,三目运算符,赋值运算符具有右结合性 。
7.表达式表达式是由运算符连接常量,变量,函数所组成的式子 。 每个表达式都有一个值和类型 。
表达式求值按运算符的优先级和结合性所规定的顺序进行 。
小 结习题,P65 3-9(写出步骤 )
3-10
3-12 (写出步骤 )
实验内容:实验指导书上机实验之实验 2
习 题 及 实 验:
实验要求:
仔细阅读实验指导书认真预习实验 2的内容