高级程序设计语言吴 凡
TEL,83202682
E-mail,cdwf@tom.com
电子科技大学通信与信息工程学院第三章 数据类型、运算符与表达式电子科技大学通信与信息工程学院数据类型( Type)
数据类型:是数据结构的表现形式
决定了该类型的变量或者常量的取值范围
决定了该类型的变量或者常量可以执行哪些操作
例,"int i"
i是整数类型的变量,其取值范围为- 32768~
32767之间的整数;
可以执行的操作:加、减、乘、除,求余 (算术运算);比大小(关系运算)等实数无此操作电子科技大学通信与信息工程学院运算符( Operators)与表达式
( Expressions)
运算符:定义了对不同数据类型变量或者常量的基本操作(运算)
算术运算符( Arithmetic Operators )
关系运算符( Relational Operators )
逻辑运算符( Logical Operators )
赋值运算
强制类型转换
表达式( Expressions):通过运算符将变量、常量连接起来,产生新值电子科技大学通信与信息工程学院常量与变量
常量( Constants ):是指在程序执行过程中值不发生改变的量。
常量也有数据类型
常量分为直接常量(字面常量)和符号常量
( Symbolic Constants )
直接常量,例,50,3.14,'A',,abc”
符号常量,例,#define PRICE 30
电子科技大学通信与信息工程学院符号常量
符号常量:是一种特殊形式的常量,即用一个标识符表示一个常量。
定义形式
#define 常量名(标识符) 常量值
使用符号常量:
含义清楚;
在需要改变一个常量时能做到“一改全改”
编程风格
在程序中不要出现,magic numbers”(例如:
x = 100 * 50 + 78),而符号常量名可以指明每一个常量的含义
符号常量名使用大写字母电子科技大学通信与信息工程学院符号常量举例
例:计算某类食品的价格,要求从键盘读入购买该食品的数目,输出总价格。
#include <stdio.h>
#define PRICE 28
Main ()
{
int num;
printf("input number,");
scanf("%d",&num);
printf("total = %d",num * PRICE);
return 0;
}
电子科技大学通信与信息工程学院变量( Variable)
程序执行过程中,其值可以改变的量称为变量。它用变量名(标识符)来表示,在内存中占据一定内存单元。
变量
变量名,一个变量有一个名字
变量在内存中占据一定的存储单元,在该存储单元中存放变量的值 —— 变量值
变量名是一个 符号地址
在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。
电子科技大学通信与信息工程学院变量名与变量值
例,int a = 3;
...
...
3
...
...
...
...
...
3
a 变量名变量值存储单元
80A5
80A6
80A7
80A8
80A9
80AA
80AB
80AD
变量 a
地址 内存电子科技大学通信与信息工程学院标识符(包含变量名)的命名规则
标识符( identifier):用来标识变量名、符号常量名、函数名、数组名、文件名等的有效字符序列称之为标识符。
命名规则
只能由字母 (a~z,A~Z)、数字 (0~9)和下划线 ('_')三种字符组成
例,不合法 的标识符 bass-9 first one
第一个字符只能是字母或下划线
一般只有库函数才有以 '_'为首字母标识符
用户一般不用 '_'作为标识符的首字母,避免冲突
区分字母大小写
例如,int a,A; /*a和 A是两个不同的整型变量 */
电子科技大学通信与信息工程学院标识符(包含变量名)的命名规则
关键字( Keywords)保留
关键字(保留字):在 C语言中具有特定含义,专门用作 C语言特定成分的一类标识符,例如,int
float char if else while for
例,int for; X
某些系统有标志符长度限制 (建议不超过 8字符 )。
内部表示符长度可以为 31bytes
选择变量名和其他标志符时,应注意做到“见名知义”
电子科技大学通信与信息工程学院声明( Declarations)
变量声明( Declarations):
指定数据类型;
列出将要使用的变量
格式:
数据类型 变量名 1,变量名 2,...变量名 n;
一切变量,都要先声明,后使用!
电子科技大学通信与信息工程学院数据类型概述
内容:
基本数据类型
数据在内存中的存储形式(即类型在计算机内部如何表示的)
取值范围
限定符电子科技大学通信与信息工程学院基本数据类型
基本数据类型
char:字符型,1个字节长度,可以存放系统本地字符集( character set)中的一个字符
int:整型,其存储空间长度通常反映了机器中整数的自然长度(字长)
float:单精度浮点型
double:双精度浮点型电子科技大学通信与信息工程学院
char(字符型)
char:字符型,长度为一个字节
字符在内存单元中存放的是其对应的 ASCII码
( 8bit的 0,1二进制序列)
例 字符 'a',在内存中占一个字节 (8bits)
'a'
类型长度决定了类型的取值范围,char的取值范围( ASCII码取值),0~ 28- 1( 0~ 255)
ASCII码( P364)
‘0’?48;‘ A’?65;‘ a’?97
0 1 1 0 0 0 0 1
电子科技大学通信与信息工程学院补充 1:字长
bit:在计算机中采用二进制,代码只有,0”和,1”,其中无论是,0”或是,1”在 CPU中都是 一“位”。
字长,CPU在单位时间内 (同一时间 )能一次处理的二进制数的位数叫字长。
例:
8位 CPU:即能一次处理 8位数据的 CPU。
32位的 CPU:就能在单位时间内处理字长为 32位的二进制数据。
字节和字长的区别:由于常用的英文字符用 8位二进制就可以表示,所以通常就将 8位称为一个字节。字长的长度是不固定的,对于不同的 CPU、字长的长度也不一样。 8位的 CPU一次只能处理一个字节,而 32位的 CPU一次就能处理 4个字节,
同理字长为 64位的 CPU一次可以处理 8个字节。
电子科技大学通信与信息工程学院补充 2:补码( 1/3)
源码:计算机中采用一组二进制序列来存储数值,其中最高位为符号为 (0为正,1为负 )。
例,(+10)源 =00001010
例,(-10)源 =10001010
例:十进制,10- 10 = 10 + (- 10) = 0
源码,00001010 +10001010 =10010100 =-20X
电子科技大学通信与信息工程学院补充 2:补码( 2/3)
反码:
正数的反码=源码
负数的反码=除符号位外,源码的其余各位逐位取反
例,(-10)源 =10001010,则 (-10)反 = 11110101
补码:
正数的补码=源码=反码
负数的补码=反码+ 1
例,(-10)补 = 11110110
例,(10)补 + (-10)补 = 00000000补 = (0)10
例,(9)10+(-6)10= (9)补 + (-6)补
=00001001+11111010=00000011=(3)10
电子科技大学通信与信息工程学院补充 2:补码( 3/3)
例,(5)10+(-6)10= - 1
(5)补 + (-6)补 =00000101+11111010=11111111补
=(- 1)10
补码的设计目的是:使符号位能与有效值部分一起参加运算,从而简化运算规则。
所以,在计算机内部数值都被表示成为补码的形式。
电子科技大学通信与信息工程学院
int(整型)
整型数据在内存中以二进制 补码 来表示
int其存储空间长度通常=机器字长
通常 int长度为 32bit/16bit,其中第一个 bit表示符号位( 0:正,1:负)
例,int num = 120;
例,int num = - 120;
如果 int长度为 16bit,取值范围是 -216- 1~ 216- 1-1,
(-32768~32767)
0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0
1 1 1 1 1 1 1 1 1 0 0 0 1 0 0 0
电子科技大学通信与信息工程学院浮点型(实数型)
实数有两种表示形式:
十进制数形式,由数字和小数点组成
例,123.4,5.0
指数形式,字母 e之前必须有数字,e之后必须为整数
例,123.4e0 = 123.4,1.234e2 = 123.4,
123.4e-2=1.234
规范化的指数形式( C中实数的指数形式的 输出 )
字母 e之前的小数部分,小数点左边应有且只有一位(非 0)
数字
例,4.321e-02,4.321e+02
电子科技大学通信与信息工程学院浮点型在内存中的存放形式
以 float型为例:
按指数形式存储 (小数)符号位+小数部分+(指数)
符号位+指数部分
例,12.345
在内存中一般占 4个字节( 32bit)
C标准未定义具体格式,一般 C编译器以 24bit表示小数部分
(包括符号位),8bit指数部分(包括指数的符号位)
小数部分位越多,有效数字越多,数值范围越小
float型的有效数字为 7位数符 小数 阶符 指数
0 1.2345 0 1
电子科技大学通信与信息工程学院浮点型
float型:单精度浮点类型,典型长度:
32bit,典型有效数字,7位
double型:双精度浮点类型,典型长度:
64bit;典型有效数字,15~ 16位
例,float f = 1.2345678;
f的有效数字只有 7位,即 1.234567,超出 7位的部分直接舍去( 8被舍去)
f的指数形式的输出为,1.234567e+00
电子科技大学通信与信息工程学院限定符( qualifiers)
限定符(即修饰符)用于限定基本数据类型
主要用于改变数据类型在内存中的长度?改变类型的取值范围
格式:限定符 1 [限定符 2 ] 类型
例,short int
例,unsigned short int
3类限定符
short和 long(限定整型)
signed和 unsigned(限定字符和整型)
long double(限定浮点型)
电子科技大学通信与信息工程学院
short和 long
short和 long:用于限定整型,提供不同长度的整数型
例,short int sh;
long int counter;
通常,int,16/32bit,short int,16bit,
long int,32bit
编译器会跟据机器的硬件特性自主选择整型的长度。
基本规则:
short int和 int至少为 16bit
long int至少为 32bit
short int类型的长度 ≤ int类型长度 ≤ long int类型长度电子科技大学通信与信息工程学院
signed和 unsigned
signed和 unsigned:用于限定 char类型和所有整型(包括 short int类型,int类型,long
int类型)
unsigned限定的类型的数值总是非负( 0,正整数)
signed限定的类型的数值有正、有负
例,unsigned char:取值范围 0~ 28- 1=255
例,signed char:取值范围 -128~ 127
例,unsigned int:取值范围 0~ 216- 1=65535
电子科技大学通信与信息工程学院
signed和 unsigned
注意:
signed和 unsigned可以限定所有整型
例,unsigend int
signd long int
当整数没有限定符时,默认是有符号的(即类型内存结构中有 1bit的符号位)
例,int num; /*长度为 16bit,其中 1bit符号位,15bit数据 */
字符型没有限定符时,是否有符号位由编译系统决定电子科技大学通信与信息工程学院
long double
long double(高精度浮点数 ),类型长度
≥double (双精度类型)
long double 型:典型长度,128bit;典型有效数字,18~ 19位电子科技大学通信与信息工程学院基本数据类型详述
每一种类型:
内存中的存放形式
分类
常量(表示的方法,特殊的常量)
变量(类型的声明与定义,取值范围)
细节问题电子科技大学通信与信息工程学院
1,整型数据
整型分类
有符号型:
[signed] int:基本整型
短整型 ([signed] short [int])
长整型 ([signed] long [int])
无符号型:
无符号整型 (unsigned int)
无符号短整型 (unsigned short)
无符号长整型 (unsigned long)
在内存中的存放形式( P41,P44)
取值范围( P43)
电子科技大学通信与信息工程学院整型数据
整型常量
基本型( int)常量表示方法:
十进制数,例,12,345,0
八进制数 (以 0开头 ),例,012,045
十六进制数 (0x开头 ),例,0x12,0x345
长整型( long)常量表示方法:常数后加后缀 L( l)
例,43210L( 43210l); 0x10ACA870L; 1234L
无符号整型常量表示方法:常数后加后缀 U( u)
例,4321U; 43210UL; -1234U( = 64302); 1234U
电子科技大学通信与信息工程学院整型数据
整型变量
分类( P42)
定义格式( P44)
细节问题:溢出
避免溢出:根据估计变量值的范围,定义相应类型的整型变量电子科技大学通信与信息工程学院
2,实型数据(浮点型)
实型变量的分类( P46)
单精度 (float) 例,float x,y;
双精度 (double) 例,double z;
长双精度 (long double) 例,long double t;
在内存中的存放形式:按指数形式存放
取值范围和有效数字长度( P46)
取值范围由小数部分和指数部分共同决定
内存中,小数域的长度决定的该种类型浮点数的有效位数。例如,float型,小数部分为 24bit,小数域的长度为 24- 1= 23bit,223= 8388608,有 7位有效数字数符 小数 阶符 指数小数部分 指数部分电子科技大学通信与信息工程学院实型数据(浮点型)
细节问题:
舍入误差( P47):一个浮点型数据的有效数字长度有限的,在有效位以外的数据会被省去,
这样可能会产生误差
例 3.4
电子科技大学通信与信息工程学院实型数据
实型常量
两种表示方法:十进制数形式和指数形式
例,10.0(实数常量)而 10(整型常量)
例,1.234e4
也可以在实常量加后缀 F( f)
实型变量
分类( P46)
定义格式( P47)
电子科技大学通信与信息工程学院
3,字符型数据
字符数据的存储
字符在内存单元中存放的是其对应的 ASCII码
( P374),且一个字符占用一个字节的存储空间
C语言中,字符型数据可以视为是一种特殊的整型数据( 8bit的整数)。
字符型数据可以赋值为整数值( ASCII值,0~
255),
字符数据可以以字符形式输出,也可以用整数形式输出。例 3.6
可以对字符型数据进行算术运算 例 3.7
电子科技大学通信与信息工程学院字符数据的存储(续)
在 Turbo C中把字符处理为带符号的整数
ASCII码取值为 0~ 255,所以 ASCII码值为 128~
255间的字符,最高位为 1(即符号位)
例:求下段代码的输出
char c = 130
printf("c = %d",c);
解,C在内存中:
10000010补 = - 126
所以打印出来 c = - 126
1 0 0 0 0 0 1 0
电子科技大学通信与信息工程学院字符型数据
字符常量
一般字符常量的表示:撇号 (单引号 )括起来的单个字符
例,'a'; 'F','0','+ '
特殊字符常量(键盘无法直接输入):特点由
'\'转义字符引导( P48)
例,'\n':换行符
例,'\\':反斜杠
例,'\016':对应 ASCII码值为 14的字符(见 P374)
电子科技大学通信与信息工程学院字符型数据
字符串常量
用双引号括起来的字符序列
例,"abcd","a"(区别字符常量 'a')
存储形式( P52)
系统自动在字符串的末尾加上一个字符串结束标记‘ \0’,以此判断字符串是否结束。
程序中长度为 n个字符的字符串常量,在内存中需要用 n+1个字节空间来存储它。
举例:字符串,string”的存储
s t r i n g \0
115 116 114 105 110 103 0
电子科技大学通信与信息工程学院字符型数据
字符变量
字符变量用来存放字符常量
只能放一个字符
例,char ch = 'a';
电子科技大学通信与信息工程学院变量赋初值
C语言允许在定义变量时对变量进行初始化,即对变量赋初值。
例:,
对变量进行初始化,允许只对定义的变量的一部分赋初值。
例,int a,b,c = 25;
例,int a,b = c = 25; X
C语言中若有几个变量初值相同,必须分别赋值。
对字符型变量初始化时,既可以将字符用单引号括起来直接赋值,也可以使用该字符的 ASCII码进行赋值。
例,char ch = ‘A’; char ch = 65;
int a = 2; int a;
a = 2;
电子科技大学通信与信息工程学院
基本的算术运算符,+ - * / %
乘法运算 (*),例,2*y,而 2y和 2?y都是非法的
除法运算 (\),两个操作数中:
均是整数,其值为整数。例,8 / 3 = 2
有一个负整数操作数,结果向零取整。例,-5 / 3 -2
有一个浮点数,其结果为 double型
模运算 (%),例,7 % 4 = 3
两个操作数必须都是整型算术运算符电子科技大学通信与信息工程学院算术表达式
算术表达式:用算术运算符和括号将运算对象(操作数)连接起来,符合 C语法规则的式子
运算对象(操作数):包括常量、变量、函数
例,x + sqrt(a+b)/(abs(a-b)+x)
=
xba
bax


电子科技大学通信与信息工程学院
运算符(包括算术运算符)具有优先级与结合性
算术表达式求值时,
先确定优先级,例 *,/,%,+,-
相同优先级,根据运算符的结合性(结合方向)
确定执行顺序
算术运算符结合方向:从左向右
例如,x + y * 3 / (z - 8)
算术表达式电子科技大学通信与信息工程学院
强制类型转换符将一个表达式的值转换为所需类型的值
强制类型转换符格式,(类型名 )(表达式 )
例,a是 int型,而( double) a:将 a的值转换为 double型
例,(int)(x + y)(区别,(int)x + y)
强制类型转换符并不改变操作变量的类型值,例 3.8
强制类型转换符电子科技大学通信与信息工程学院自增、自减运算符(++,--)
++i,--i:先自增 /减,再使用 i( i值已修改)
i++,i--:先使用 i( i值已修改),再自增 /

例:
例:
j = i++; j = i;
i = i + 1;
j = ++ i; i = i + 1;
j = i; 区分:j = i+1;/*i值未变 */
j = ++i;/*i值改变 */
电子科技大学通信与信息工程学院自增、自减运算符
自增、自减运算符只能用于变量,而不能用于常量和表达式
例,PRICE++ X; 5++ X; (a+b)++ X; (-b)++ X
自增、自减运算符优先级高于算术运算符,结合方向“自右向左”
例:如果 i= 3,那么 printf("%d",-i++)输出是几? i值又为几?
电子科技大学通信与信息工程学院
格式:变量 = 表达式 /常量 /变量
例,a = (x+y); x = 3; x = y;
作用:将等号 右边 的表达式 /常量 /变量的 值 赋值给等号 左边 变量
区别赋值运算符与数学中的”等于“
赋 值,
例赋值运算符
i = 3;
j = i; 3
i
存储单元
3
j
存储单元电子科技大学通信与信息工程学院
整型与浮点型
1,浮点型数据?整型变量:取整(舍掉实数的小数部分)
2,整型数据?浮点型变量(单,双精度):数值不变,
以浮点形式存储到变量中
浮点型间
1,double型数据?float型变量:截取前面 7位有效数字存放到变量中,注意避免数值范围溢出
2,float型变量? double型数据:数值不变,有效数字扩展到 16位赋值结果与类型转换电子科技大学通信与信息工程学院
整型之间
1,长度相同的有符号和无符号的整型数间:原样赋值
整型包括,char,short,int,long
负值?无符号整型变量,无符号整数?整型变量间转换时,数值会变化。
例 3.9
赋值结果与类型转换
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1int b = -1;
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1unsigned a = b;
/*a= 216-1=65535*/
电子科技大学通信与信息工程学院赋值结果与类型转换
整型之间
2,长度不同的有符号整型数( char,short,int,
long)间:
① 短数据?长变量:需要符号扩展符号扩展:若最高位为 1(负值),变量高字节补
1,反之补 0。

1 1 1 1 1 1 1 0char c = '\376';
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1int a = c;
电子科技大学通信与信息工程学院赋值结果与类型转换
整型之间
2,长度不同的有符号整型数( char,short,int,
long)间:
② 长 数据?短 变量:将数据低字节位原封不动地送到变量中

10 00 00 00 00 00 10 00int b = a;
/*b = -32760*/
00 00 00 00 01 10 00 00 10 00 00 00 00 00 10 00long a = 6324232L;
电子科技大学通信与信息工程学院
几个需要注意的问题
子表达式的求值顺序
运算符的结合规律
实参数的求值顺序第三章 数据类型、运算符与表达式电子科技大学通信与信息工程学院第三章 数据类型、运算符与表达式
逗号运算符和逗号表达式
一般形式为:表达式 1,表达式 2
求解过程为:先求表达式 1,再求表达式 2。整个逗号表达式的值是表达式 2的值。
如,a = (3*5,a*4)
a = 3*5,a*4