C语言的数据类型.ppt_第1页
C语言的数据类型.ppt_第2页
C语言的数据类型.ppt_第3页
C语言的数据类型.ppt_第4页
C语言的数据类型.ppt_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第2章 C语言的数据类型、运算符及其表达式,第一节 C的数据类型及常量数据 第二节 变量及其类型 第三节 运算符和表达式,1 / 71,C语言程序设计 龙昭华主编,课件制作:刘达明第一节 C的数据类型及常量数据,(第二章 C语言的数据类型、运算符及其表达式),2 / 71,由于“程序=算法+数据结构”,算法处理的对象是数据,而数据是以某种特定的形式存在的(如整数、实数、字符等)。不同的数据之间往往还存在某些联系(如若干整数组成一个整数数组)。 所谓数据结构指的是数据的组织形式,如数组就是一种数据结构。不同的 计算机语言所允许定义和使用的数据结构是不同的,处理同一类问题如果数据结构不同,算法也会不同。因此考虑算法时,必须注意数据结构。,一、 C的数据类型分类,实际上,应当综合考虑算 法和数据结构,选择最佳的数 据结构和算法。 C语言的数据结构是以数 据类型形式出现的。 C的数据类型分类如右边 所示:,课件制作:刘达明二、 常量及其类型,第一节 C的数据类型及常量数据,3 / 71,在程序运行过程中,其值不能被改变的量称为常量。 1、直接常量 常量一般从其字面形式即可判断,这种常量称为字面常量或直接常量。常 量分为以下不同类型: 、整型常量 即整常数,它在C中有三种表示方法: 十进制整数:如:58、123、-456、0、-9等。它们是以非数字0开头, 并由数字09组成,可以带正负号。 八进制整数:如:011、089、-0112、00、-09等。它们是以数字0开头, 并由数字07组成,可以带正负号。 十六进制整数:如:0x123、0X119、0x8f、-0x1E、0x0等。它们是以数 字0和字母x联合组成的0x或0X开头,并由数字09和字母AF(或af)组成, 可以带正负号。 注意:在整型常数后添加字母“L”或“l”,是长整型数,添加“u”则是无符号 基本整型数。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明、实型常量,第一节 C的数据类型及常量数据,4 / 71,实型常量又称浮点数,它即数学里的实数,在C中有两种表示方法: 十进制小数形式:它由数字09和小数点组成(注意必须有小数点.),可以 带正负号。如:.123、56.、89.0、-456.32、0.0、-.9、0.78、-0.99等。 指数形式:也称科学表示法。如:123e3或123E3都代表123*103。 注意:字母e或E之前必须有数字,且字母e或E之后的指数必须是整数。 一个实数可以有多种指数表示形式,如:123.456可以表示为123.456e0、 12.3456e1、1.23456e2、.123456e3、0.0123456e4等。我们把在字母e或E之前 的小数部分中,小数点左边应有一位(且只能有一位)非零的数字的表示称为“规 范化的指数形式”。如1.23456e2、-6.8e8、8.9e-2等。一个实数在用指数形式 输出时,是按规范化的指数形式输出的。如:5689.65按指数形式输出的话,结 果为5.68965e+003。 注意:浮点常数只有一种进制(十进制);所有浮点常数都被默认为double 型;实数常量后面跟一个f或F表示该常量为float型,或跟一个l或L表示该常量 为long double型。如:8.9、8.9F、8.9L表示不同的数据类型。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明、字符型常量,第一节 C的数据类型及常量数据,5 / 71,C的字符型常量是用单引号括起来的一个字符。(注意是单引号) 如:A、a、D、*、$、0等。注意:A和a是两个不同的字符常量。 除了以上形式的字符常量外,C语言还有一种特殊的字符常量转义字符。它以“”开头,使用时用一对单引号将其括起来。如n表示回车换行字符,即键盘上的“Enter”键。,如: printf(“a=11n”); printf(“c=33”); 输出结果为: a=11 b=33 如果不带n字符, 则输出: a=11c=33 8进制:101表A。 16进制:x41表A。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明、字符串常量,第一节 C的数据类型及常量数据,6 / 71,字符串常量是一对双引号“”括起来的字符序列。如: “how do you do!”、 “a”、“123”。 C规定:在每一个字符串的结尾加一个“字符串结束标志”(为字符0), 以便系统据此判断字符串是否结束。0是一个ASCII码为0的字符,从ASCII代 码表中可以看到ASCII码为0的字符是“空操作符”,即它不引起任何控制动作, 也不是一个可显示字符。 特别注意:用一对单引号括起来的是字符,它只占一个字节。而一对双引 号“”括起来的是字符串,它占至少两个字节,在字符串结尾处有空字符0。 在C语言中,没有专门的字符串变量,如果想将一个字符串存放在变量中,必须使用字符型数组。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明2、符号常量,第一节 C的数据类型及常量数据,7 / 71,符号常量是指用一个标识符代表的常量,即标识符形式的常量。 定义符号常量的方法是用#define命令把一个常量名和常量联系起来,符号常量的使用给调试程序带来很大的方便。符号常量的值在其作用域内不能改变,也不能重新赋值。 如: #define N 5 表示N代表常量5。 习惯上,符号常量名用大写,变量名用小写,以示区别。 使用符号常量有如下好处:第一,含义清楚。第二,在需要改变一个常量时能做到“一改全改”。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明例 2.1:,第一节 C的数据类型及常量数据,8 / 71,(第二章 C语言的数据类型、运算符及其表达式),#include #define PRICE 30 main() int num,total; num=10; total=num*PRICE; printf(“total=%dn”,total); 程序运行结果为:total=300,#define命令出现在程序中函数的外面,其有效范围为定义命令之后到文源文件结束。通常,#define命令写在文件开头,函数之前作为文件一部分,其作用域为整个文件。如例2.1。当然也可以用#undef命令终止#define的作用域。如例2.2。,例 2.2: #include #define TEMP 100 main() #undef TEMP f1() ,TEMP的作用域,课件制作:刘达明第2章 C语言的数据类型、运算符及其表达式-习题1,9 / 71,C语言程序设计 龙昭华主编,习 题 (一) * 复习本章已讲内容,预习本章剩余内容。,课件制作:刘达明第二节 变量及其类型,10 / 71,一、 变量及其分类,1、变量的概念 变量是指在程序运行过程中,其值可以改变的量。变量具有三要素:变量名、变量值、变量地址(即变量存储单元的首地址)。即一个变量应该有一个名字,在内存中占据一定的存储单元,在该存储单元中存放变量的值。,(第二章 C语言的数据类型、运算符及其表达式),变量名实际上是一个符号地址,在对程序编译时,由系统给每个变量名分配一个内存地址。在程序中从变量中读值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。变量要先定义后使用。 变量名是标识符(用来标识变量、符号常量、函数名、数组名、类型名、文件名等的有效字符序列)的一种,它是由字母、数字、下划线三种字符组成的,且第,一个字符必须为字母或下划线,其长度不要超过8个字符(MSC)或32个字符(TurboC)。为了通用,建议不要超过8个字符。对于一般用来表示整数变量和临时变量的单字符变量名,由于易与数字1和0混淆,而不使用字母l和o,单字符变量一般使用i、j、k、m、n。,课件制作:刘达明变量值:,第二节 变量及其类型,11 / 71,变量是用来存放数据的,由于数据有不同的类型,因此要定义相应类型的变量来存放它。对某变量规定数据类型,实际上是对该变量内存中存放的二进制数值按照相应数据类型的规定进行相应的值解释而已。 变量地址:在C程序编译时,会根据变量的数据类型为每个变量划出一定数目的存储单元存放变量的值,变量所占据的存储单元的起始地址就是变量的地址。 变量的地址表示为:&变量名,例如:char a=D; 则 则&n就是整型变量n的地址,如右图所示:整型变量n的地址3002,但整型变量n的值就存储在存储单元3002和3003两个字节中。,例如: int a,b; scanf(“%d , %d”,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明2、变量的分类,第二节 变量及其类型,12 / 71,根据所声明的位置不同,变量可分为局部变量、形式参数和全局变量。 变量可以在程序中三个地方声明:函数内部、函数的参数定义中或所有的函数 外部。 根据变量存储类型,变量可分为自动变量(用auto声明)、静态变量(用static 声明) 、外部变量(用extern声明)和寄存器变量(用register声明)。 声明变量时,如果不指定存储类型,则其缺省的存储类型为自动变量。因 此,定义自动变量时不必使用auto声明。我们使用的大多数变量都属于自动变 量存储类型。 根据数据类型,变量可分为整型变量(用int、long等声明)、实型变量(用 float、double等声明)、字符型变量(用char声明)、 数组变量、指针型变量、结 构体变量(用struct声明)、 共用体变量(用union声明)、 枚举类型变量(用enum声 明)。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明3、变量的声明和赋值,第二节 变量及其类型,13 / 71,变量的声明方法: 类型名 ; 如:int i,j,k; char a,b,c;,(第二章 C语言的数据类型、运算符及其表达式),变量赋初值的方法: 如: int i=3 , j ; char a=A , c ; j=10; c=9;,注意:在C语言中,要求对所有用到的变量做强制定义,也就是说“先定义, 后使用”,这样做有如下好处: 凡是未被事先定义的,不做变量名,保证程序中变量名不至于前后书写不 一致。 每一变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。 指定每一变量属于一个类型,这就便于在编译时,据此检查该变量所进行 的运算是否合法。如:整型变量a和b可以进行求余运算:a%b ,得到 a/b 的余 数。但如果将a和b指定为实型变量的话,则不允许进行“求余”运算。,课件制作:刘达明二、 基本数据类型变量,第二节 变量及其类型,14 / 71,1、整型变量 整型变量在内存中的存放形式 数据在内存中是以二进制形式存放的。整型变量是用来存放整型数据的变量,而整型数据在计算机内存中以补码形式存放的。(一个正数的补码和其原码相同。而负数的补码是将该值的绝对值的二进制形式,按位取反再加1。),当符号位sf为0时,表示该数为正数;当sf为1时, 表示该数为负数。 例如:int i=10,j=-10; 的存储 方式见图a和图b。图a表示存放示意图,图b是数据 在内存中的实际存放情况。整型数为16位二进制数。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明有符号整型数据和无符号整型数据的存储:,第二节 变量及其类型,15 / 71,有符号整数的范围-3276832767,无符号整数的范围065535。无符号整数 使用unsigned修饰。在声明变量时,如果不指定unsigned或指定signed,则表 示有符号型数据,符号位有效。如果指定unsigned,则表示无符号型数据,符 号位为该数本身。,(第二章 C语言的数据类型、运算符及其表达式),如: int a,b; a=32767; b=-1; unsigned int c; c=65535;,课件制作:刘达明、整型变量的分类,第二节 变量及其类型,16 / 71,有符号整型变量 基本型:一般占2个字节(16位),int 短整型:一般占2个字节(16位),short int 长整型:一般占4个字节(32位),long int 有符号整型变量使用signed修饰,但缺省的数据类型即表示有符号整型数 据,因此可以省略修饰符signed。 无符号整型变量 无符号基本型:一般占2个字节(16位),unsigned int 无符号短整型:一般占2个字节(16位),unsigned short int 无符号长整型:一般占4个字节(32位),unsigned long int,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明、整型变量长度,第二节 变量及其类型,17 / 71,C标准没有具体规定整型变量各类型数据所占内存字节数,只要求long型数 据长度不短于int型,short型不长于int型。具体如何实现,由各计算机系统及 C系统自行决定。 各种计算机的数据字长,在C系统中,通常把long定义为32位,把short定义为16位,而int可以是16 位或32位,主要取决于机器字长,一般以一个机器字word存放一个int数据。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明各种整型数据在C系统中的长度及取值范围,第二节 变量及其类型,18 / 71,ANSI标准建议各种整型数据所占位数和数值范围如右表所示(TurboC与该表定义一致): 注意: 在微机上用long型可以得到大范围的整数,但同时会降低运算速度,因此除非不得已,不要随便使用long型数据。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明、整型变量的定义与赋值,第二节 变量及其类型,19 / 71,每个变量使用前必须定义,一般放在函数的开头的声明部分定义变量。如: 定义: int a,b; short i,j; long x,y; /* 定义有符号整型变量 */ unsigned int c,d; unsigned short e,f; unsigned long s,t; 赋值: a=21910; b=-20; i=-30201; j=90; x=801023; y=-203984; c=400u; d=9010; e=1002; f=2030; s=80L; t=-987L; 注意: 一个在-3276832767范围内的整数,则认为是int型,可赋给int型和long型。 一个超过了-3276832767范围内的整数,而在-2147483648-2147483647范围内,则认为它是long型,可以赋给long型。 一个整常量后面加一个字母u,则认为是unsigned int型,如:123u。如果写成-12345u,则先将-12345转换成其补码53191,然后再按无符号数存储。如:unsigned int a=-12345u; printf(“%d, %un”,a,a); 结果为:-12345, 53191。 一个整常数量后面加一个字母L或l,则认为是long型。这往往用于函数调用,如果函数的形参为long,则要求实参也为long型,此时用123则不行,而要用123L代入。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明、整型数据的溢出,第二节 变量及其类型,20 / 71,一个int型变量的最大允许值为:32767。如果再加1,则结果会变成-32768。,(第二章 C语言的数据类型、运算符及其表达式),例 2.3: main() int a=32767,b; long c; b=a+1; c=(long)a+1L; printf(“a=%d,b=%d,c=%ld”,a,b,c); 运行结果为:32767,-32768,32768,例 2.4: main() int x= -1; unsigned int y; y=x; printf(“%d,%d,%un”,x,y,y); 运行结果为:-1,-1,65535,无符号数输出时,最高位数值变成符号位。如符号位为1,则输出负数。,课件制作:刘达明2、实型变量,第二节 变量及其类型,21 / 71,实型数据在内存中的存放形式 存放实数的变量就是实型变量。一个实型变量在内存中是按浮点数指数形 式存放的。系统把一个实型数据分成小数部分和指数部分,分别存放。指数部 分采用规范化的指数形式。常用的微机系统中一个实型数据在内存中占4个字节 (32位),在这32位中,究竟用多少位来表示小数部分,多少位来表示指数部分, 标准C并无规定,由各C编译系统自定。不少C编译系统以24位表示小数部分(包 括符号),以8位表示指数部分(包括指数的符号)。小数部分占的位(bit)数愈 多,数的有效数字就越多,精度愈高。指数部分占的位数越多,则能表示的数 值范围就越大。,(第二章 C语言的数据类型、运算符及其表达式),如实数:31.4159的指数形式为: .314159*102 ,它在内存中的存放形式可以 表示为右图所示。 图中用十进制表示的,实际上在计算机 中是用二进制来表示小数部分,用2的幂次 来表示指数部分。,课件制作:刘达明、实型变量的分类及其长度,第二节 变量及其类型,22 / 71,C的实型变量分为:单精度(float型)、双精度(double)、长双精度(long double)型三种。下表列出了微机上常用的C编译系统(如TurboC、MSC、Borland C)的实型数据的情况。注意:不同的系统、不同的资料会有所差异,浮点数的内部表示与机器的硬件结构相关,是最少被计算机标准化的内容之一,对特定的编译器都应阅读其文档资料以了解float和double的精度和范围(在ANSI中的limits.h也有列示)。,(第二章 C语言的数据类型、运算符及其表达式),如:float是7位有效数 字, float a=7758.521125; a的后3位不其作用,实际 上输出a=7758.520996。 double有效数字为15 位,也有类似问题。 long double型有效数 字为19位,用得很少, 这里不作介绍。,课件制作:刘达明、实型变量的定义与赋值,第二节 变量及其类型,23 / 71,每个变量使用前必须定义,一般放在函数的开头的声明部分定义变量。如: 定义: float a,b; double i,j; long double x,y; 赋值: a=21.910; b=-20.09832; i=-30201.09282; j=90.987760900; printf(“a=%fn”,a); /* 输出结果a=21.910000 */ 注意: 将一个float型数据赋给double型变量,有效数字决不会丢失。而将一个double 型数据赋给float型变量,就可能丢失有效数字。 如:将实型常量7865.54986621116分别赋给实型变量a和b: float a; double b; 当它赋给a时,只有前7位有效,即a=7865.549,后几位不起作用。 当它赋给b时,全部有效,即b= 7865.54986621116。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明、实型数据的舍入误差,第二节 变量及其类型,24 / 71,由于实型变量是用有限的存储单元存储的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去,由此可能会产生一些误差。,(第二章 C语言的数据类型、运算符及其表达式),例 2.5: main() float a,b; a=123456.789e5; b=a+20.0f; printf(“a=%fnb=%fn”,a,b); 运行结果: a=12345678848.000000 b=12345678848.000000,输出结果是a与b相等。虽然理论上b应 比a大20,应为12345678920。而实型变量 只能保证7位有效数字,后面的数字是无 意义的,并不准确地表示该数。 因此应该避免将一个很大的数和一个 很小的数直接相加或相减,否则就会“丢 失”小的数。 同样,计算1.0/3.0*3.0的结果并不等 于1。,课件制作:刘达明3、字符型变量,第二节 变量及其类型,25 / 71,字符型变量的存放形式 字符型变量用来存放字符型常量。 一个字符变量只能存放一个字符,要存放字符串(包括若干字符)必须声明字符数组。在所有编译系统中,都规定用一个字节来存放一个字符,或者说一个字符变量在内存中占一个字节。将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII码放到存储单元中。因此其存储方式类似于整型变量。,(第二章 C语言的数据类型、运算符及其表达式),如: char c1=a,c2=b; /* a的ASCII为97 b的ASCII为98 */,ASCII的取值范围为0255的整型常数,其中0127为基本ASCII码,128255 为扩展ASCII码。C语言规定,在0255范围内,字符型与整型数据是等价的, 是可以互相转换的。 如:char a=0,b=97; int i=10,j=b;,课件制作:刘达明、字符变量的定义与赋值,第二节 变量及其类型,26 / 71,字符型变量加上不同的修饰符,可以定义有符号和无符号两种类型的字符型变量,其定义方式如下: char a,b,c; /* 定义变量a,b,c都为有符号字符型变量 */ unsigned char x,y,z; /* 定义变量x,y,z都为无符号字符型变量 */ 由于字符在计算机中以其ASCII码方式表示,其长度为1个字节。因此有符号字符型数据转换成整型数据时其取值范围为-128127,无符号字符型数据转换成整型数据时其取值范围是0255。作为字符型本身输出时,其ASCII码范围仍然是0255。也就是说,作为字符本身的定义没有必要加unsigned修饰符,而作为与整型数的转换则非常有必要了。 字符变量的赋值:如:a=65; b=B; c=,(第二章 C语言的数据类型、运算符及其表达式),例2.6: main() char c1=a,c2=b; /* 等价于char c1=97, c2=98; */ c1=c1-32; c2=c2-32; printf(“%d,%cn”,c1,c1); printf(“%d,%cn”,c2,c2); ,输出结果为: 65,A 66,B,课件制作:刘达明三、 指向基本数据类型变量的指针变量,第二节 变量及其类型,27 / 71,1、地址和指针的概念 在内存区中,系统对每一个存储单 元(即每一个字节)都有一个编号,这个编号就是“地址”。如右图中的2000、2002、2004等。在地址所标志的内存单元中存放数据。 如定义int i=3,j=6,k=9;三变量,每个变量占2个字节,系统编译时2000和2001两个单元分配给了变量i,因此2000和2001单元中存放数据3。 在程序中,一般是通过变量名来对内存单元进行存取操作,其实程序经过编译后已经将变量名转换为变量的地址,对变量值的存取都是通过地址进行的。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明直接访问方式:,第二节 变量及其类型,28 / 71,直接访问方式是指按变量地址存取变量值的方式。如读取i的值3,是根据 变量名与地址的对应关系,找到变量i的地址2000,然后从2000开始的2个字节 中取出数据,即变量i的值3。如果输入数据时,则是将键盘输入的值送到相应 地址的存储单元中。 间接访问方式: 间接访问方式就是将变量的地址存放到另一变量中。取数时,先从另一变 量中找到原变量的地址,然后再从该地址中取出该变量的值。按C语言规定,可 以在程序中定义整型变量、实型变量、字符型变量等,也可以定义一种特殊的 变量,用它来存放地址。如:定义变量i_pointer用来存放整型变量i的地址 2000,变量i_pointer被分配为3010和3011两个字节的存储单元。可以通过 i_pointer=&i 将i的地址2000赋给i_pointer变量。 使用间接方式取i的值就是:先找到存放“i的地址”的变量i_pointer,从中 取出i的地址2000,然后到2000、2001单元中取出i的值3。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明指针,第二节 变量及其类型,29 / 71,将数值3送到变量i中,有两种方式: 将3送到变量i所标志的单元中(2000和2001)。这是直接访问方式。 将3送到变量i_pointer所“指向”的单元中(即所标志的单元2000和2001)。 所谓“指向”,就是通过地址来体现的。这是间接访问方式。 由于通过地址能找到所需的变量单元,也可以说地址“指向”该变量单元,在C语言中,形象化地称为“指针”,意思是通过它能找到以它为地址的内存单 元。指针就是地址,地址就是指针。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明2、变量的指针,第二节 变量及其类型,30 / 71,一个变量的地址称为该变量的“指针”。如2000是变量i的指针。指针就是地 址,变量的指针就是变量的地址。 存放变量地址(即指针)的变量,就是“指针变量”,它指向另一个变量。 注意:指针变量的值(即指针变量中存放的值)是指针。为了表示指针变量 和它所指向的变量之间的联系,在程序中用星号“*”表示“指向”。如i_pointer 就是一个指针变量,它存放变量i的指针,而*i_pointer是i_pointer所指向的 变量。,(第二章 C语言的数据类型、运算符及其表达式),指针是指向变量的地址,实质上指针就是存贮单元的地址。指针变量就是 专门存放另一变量的的地址的变量。根据所指的变量类型不同,可以有整型指 针(int *)、实型指针(float *)、字符型指针(char *)、void指针类型 (void *)、结构体指针(struct *)和共用体指针(union *)等。,可以看到*i_pointer也代表一个变量,它和变量i是 同一回事。即赋值语句i=3;和*i_pointer=3;是等价的。,课件制作:刘达明3、指针变量的定义,第二节 变量及其类型,31 / 71,(第二章 C语言的数据类型、运算符及其表达式),C语言规定所有变量在使用前必须指定数据类型,并按此分配内存单元。 指针变量不同于整型变量和其他类型的变量,它是专门存放地址的,必须将 它定义为“指针变量”。定义指针变量的一般形式为: 数据类型名 *指针变量名; 如:int i,j,*p1,*p2; p1和p2可以指向变量i或j。 p1= C规定使用&运算符完成变量与指针变量的指向操作。 定义指针变量时注意: 指针变量前面的星号*表示该变量的类型为指针变量。特别强调,指针 名是p1,而不是*p1。 必须指定数据类型名。因为各种数据类型在内存中所占的字节数不同。 一个指针变量只能指向一个类型的变量。 可以这样理解:*p1是整型变量,如同定义i是整型变量一样。而*p1是p1 所指向的变量,p1是指针变量。,课件制作:刘达明4、指针变量的引用,第二节 变量及其类型,32 / 71,(第二章 C语言的数据类型、运算符及其表达式),请牢记,指针变量中只能存放地址(指针),不要将一个整型量(或其它任何非地址类型的数据)赋给一个指针变量。与指针有关的两个运算符:&和*。 &:取地址运算符;如:&a为变量a的地址。&运算符只能作用于变量。 *:指针运算符,又称“间接访问”运算符。*p表示指针变量p所指向的变量的存储单元的值。,例 2.7 通过指针变量访问整型变量 main() int a=100,b=10,*p1,*p2; /* *p1定义指针变量*/ p1= /* *p1为a的值 */ 运行结果为:100,10 100,10,课件制作:刘达明例 2.8: 输入a和b两个整数,按先大后小的顺序输出a和b.,第二节 变量及其类型,33 / 71,(第二章 C语言的数据类型、运算符及其表达式),程序1: main() int a,b,*p1,*p2,*p; scanf(“%d,%d”, 运算结果为: 10,56 (按回车键) a=10,b=56 max=56,min=10,程序2: main() int a,b, max,min; scanf(“%d,%d”, 运算结果为: 10,56 (按回车键) a=10,b=56 max=56,min=10,课件制作:刘达明5、指针的优缺点,第二节 变量及其类型,34 / 71,(第二章 C语言的数据类型、运算符及其表达式),指针是一种特殊的数据类型,在其它语言中一般没有。指针是C语言中的一个重要的概念,也是C语言的一个重要特色。指针有如下特点: 提高程序效率; 能有效地表示复杂的数据结构; 能动态分配内存; 能方便地使用字符串; 能有效而方便地使用数组; 能直接处理内存; 在调用函数时,能得到多于一个的值等。 掌握指针的应用,可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人,都应当深入地学习和掌握指针。可以说,不掌握指针,就是没有掌握C的精华。 指针使用非常灵活,对熟悉的程序员来说,可以利用它编写出很有特色的、质量优良的,实现许多用其他高级语言难以实现的功能。 但也十分容易出错,而且这种错误往往难以发现。如:未对指针变量p赋值,就向*p赋值,这就可能破坏了有用的单元内容。 指针是有利有弊的工具,在使用时要十分谨慎,要多上机,弄清一些细节,并积累经验。,课件制作:刘达明四、 空类型(void)和void指针类型,第二节 变量及其类型,35 / 71,(第二章 C语言的数据类型、运算符及其表达式),空类型字节长度为0,主要有两个用途:一是明确地表示一个函数不返回任何值;一是产生一个同一类型指针(可根据需要动态分配给其内存)。 将一个函数定义为空类型(void),并不是指函数没有类型,而是不用该函数返回值。在函数中,凡是不要求返回函数值的函数,一般应定义为void类型,以避免程序出错。 如:void display() printf(“This is demo program. ”); ANSI新标准增加了“void”指针类型,该指针不指向任何类型的数据。C规定用动态存储分配函数时返回void指针类型,用来指向一个抽象类型的数据,在将它的值赋给另一指针变量时要进行强制类型的转换,使之适合该变量类型。 如: char *p1; /* p1被定义为字符类型指针变量 */ void *p2; /* p2被定义为空类型指针变量 */ p1=(char *)p2; /* 将p2的值强制转换成char *类型。,课件制作:刘达明五、 各类数值型数据间的混合运算,第二节 变量及其类型,36 / 71,(第二章 C语言的数据类型、运算符及其表达式),整型(包括int、short、long)和实型(包括float、double)数据可以混合运算。而字符型数据可以与整型数据通用,因此,整型、实型、字符型数据间可以混合运算。 如: 10 + a + 1.5 8765.1234 * b 在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。其转换规则如图所示:,横向向左的箭头表示必定的转换。如:字符型数据必定先转换成整型数据,short转换成int,float转换成double。 纵向箭头表示当运算对象为不同类型时转换的方向。如:int型与double型运算时,先将int型数据转换成double型数据,然后两个double型数据间进行运算,结果为double型。注意箭头方向只表示数据类型级别的高低,由低向高转换。不表示中间类型一定要转换。,课件制作:刘达明第2章 C语言的数据类型、运算符及其表达式-习题2,37 / 71,C语言程序设计 龙昭华主编,习 题 (二) * 复习本章已讲内容,预习本章剩余内容。 2.1 请将以下3个整数分别赋给不同类型的变量,请画出数据在内存中的存储 形式。,课件制作:刘达明第三节 运算符和表达式,38 / 71,一、 运算符简介和表达式概念,(第二章 C语言的数据类型、运算符及其表达式),1、运算符简介 运算符是一种向编译程序说明一个特定的数学或逻辑运算的符号。C语言的运算符范 围很宽,它把除了控制语句和输入输出外的几乎所有的基本操作都作为运算符处理。 算术运算符: +、-、*、/、%、+、- 关系运算符: 、=、|、&、 赋值运算符: =及其双目运算符的扩展运算符+=、-=等 条件运算符: ?、: 逗号运算符: , 指针运算符: *、& 求字节数运算符: sizeof 强制类型转换运算符: (类型) 分量运算符: .、- 下标运算符: 其他: 如函数调用运算符圆括号( ) 注意:所有运算符都有两个重要的特性:优先级和结合性。,课件制作:刘达明、表达式的概念,第三节 运算符和表达式,39 / 71,(第二章 C语言的数据类型、运算符及其表达式),表达式是由运算符和运算数构成的,运算数可以是常量或变量。在C语言 中,大部分表达式的写法都是遵循代数符号法则的,对初学者,容易理解。 然而C语言中的表达式与代数符号法则仍然有不同之处。例如: 运算符的结合性; 算术表达式、关系表达式、逻辑表达式、条件表达式、逗号表达式、赋 值表达式也能构成语言的基本表达式。 C表达式与代数表达式的写法有很大差别。如:,C语言的表达式非常丰富,有人称C语言为表达式语言。,课件制作:刘达明二、 算术运算符和算术表达式,第三节 运算符和表达式,40 / 71,(第二章 C语言的数据类型、运算符及其表达式),、算术运算符(基本、自增自减、类型转换),注意: 求余运算符两侧均应为整型数据,如7%4的值为3。 两个整数相除结果为整数,并舍去小数部分,如5/3结果为1。但如果除 数或被除数中有一个为负数,则舍入的方向不固定,多数C系统规定“向0靠拢”。,课件制作:刘达明、算术表达式和运算符的优先级与结合性,第三节 运算符和表达式,41 / 71,(第二章 C语言的数据类型、运算符及其表达式),用运算符和括号将运算对象(也称操作数)连起来的、符合C语法规则的式子, 称为C算术表达式。运算对象包括:常量、变量、函数等。如: a*b/c-1.5+a 就是一个合法的C算术表达式。 C规定了运算符的优先级和结合性。 在表达式求值时,先按运算符的优先级别高低顺序执行,优先级别的数字 越小,其级别越高,越要先执行。如果在一个运算对象的两侧的运算符的优 先级别相同,则按C规定的各种运算符的结合方向 (结合性)处理。关于“结合 性”的概念在其他一些高级语言中是没有的,是C的特点之一,必须弄清楚。 如果一个运算符的两侧的数据类型不同,则会按前面讲过的先自动进行类 型转换,使二者具有相同的数据类型,然后再进行运算。 如: 表达式a+b-c,是从左向右逐项计算的,即先计算a+b,然后再计算 减c。它与(a+b)-c表达式等价。 又如:A+8.7-a*b/c,则是先转换A为65,并计算a*b在除以c,然后再 做+与-操作。它相当于: (A)+8.7-(a*b)/c)。,课件制作:刘达明3、强制转换运算符,第三节 运算符和表达式,42 / 71,(第二章 C语言的数据类型、运算符及其表达式),可以利用强制转换运算符将一个表达式转换成所需的数据类型。强制转换运 算符的一般形式为: (类型名)(表达式) 注意:类型名和表达式都应该用括号括起来。如: (double)a /* 将变量a转换成double类型 */ (int)(x+y) /* 将表达式x+y转换成int类型 */ (float)(x/2) /* 将表达式x/2转换成float类型 */ (float)(5%3) /* 将表达式5%3转换成float类型 */ 在强制类型转换时,得到的是一个所需类型的中间变量,原来变量的类型仍 未发生变化。如:float x; (int)x; 。 强制类型转换用途之一是整型量运算时,其结果需保留小数时可对其中一个 强制为float或double型,在运算前系统会自动将两个操作数转换为flaot或double 型,运算结果也是float或double型。 如: int i=10,j=4,k; float x=3.6,f; k=(int)x; f=i/j; 则有: x=3.600000 f=2.000000 k=3,课件制作:刘达明4、自增自减运算符,第三节 运算符和表达式,43 / 71,(第二章 C语言的数据类型、运算符及其表达式),自增自减运算符的作用是使变量的值增1或减1。自增+和自减-仅仅用于 变量,而不能用于常量和表达式。 +i /*相当于i=i+1,但在使用i之前,先使i值加1*/ i+ /*相当于i=i+1,但在使用i之后,再使i值加1*/ -i /*相当于i=i-1,但在使用i之前,先使i值减1*/ i- /*相当于i=i-1,但在使用i之后,再使i值减1*/ +和的结合方向是自右向左的,即对于-i+,相当于-(i+)。 例如: main() int x,y; x=10; y=+x; printf(“%d,%dn”,x,y); 运算结果为: 11,11 自增自减运算符常用于循环语句中,使循环变量自动加(减)1。,课件制作:刘达明5、表达式的求值顺序,第三节 运算符和表达式,44 / 71,ANSI C并没有规定表达式中的子表达式求值顺序,允许编译系统自己安排。如: a=f1()+f2() 并不是所有的编译系统都先调用f1(),再调用f2()。 如果i的初值为3,则表达式: (i+)+(i+)+(i+) 的值是多少? 有的系统按照“自左而右”,其结果相当于计算3+4+5为12,最后的i值是6。而另一些系统(TurboC、MSC)把3作为表达式中所有i的值,3个i相加后,再自加3次,其结果相当于3+3+3为9,最后的i值是6。为了避免歧义性,如果想得到12的结果,应写成: i=3; a=i+; b=i+; c=i+; d=a+b+c; 在调用函数时,实参数的求值顺序C标准并无统一规定。如: int i=3; printf(“%d,%d”,i,i+); 如果“从左至右”求值,其结果为:3,3。如果“自右而左”求值,其结果为:4,3。为了避免这种情况发生,最好改写成: int i=3; j=i+; printf(“%d,%d”,i,j); 结果为4,3。 思考题: 教材P30的例2.5的程序运行后,怎样得到教材给出的结果?,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明6、指针变量的算术运算,第三节 运算符和表达式,45 / 71,指针变量是一个变量,因此可以进行某些运算。但指针的本质是一个地址,其运算具有一些特别的性质,不能用普通变量的规则运算来作为指针运算的方式。 指针变量加(减)一个整数的算术运算 这里只能进行加、减、自增、自减(+、-、+、-)运算。 C语言规定,一个指针变量加(减)一个整数并不是简单地将指针变量的原值加(减)一个整数,而是将该指针变量的原值(是一个地址)和它指向的变量所占用的内存单元字节数相加(减)。 +、+代表指针前移,-、-代表指针后移。指针变量每加(或减)1,就指向它指定的数据类型的下一个(或上一个)元素的位置。 如:p+i(p是指针变量,i是整数),代表的地址计算:p+c*i(c为指针变量所指向的数据类型所占内存的字节数)。运算:p+、p-,+p,p-=i,p+=i, p=p+i,p=p-i等(这里i表示整型数据)。这些运算的结果仍为指针。 例如: int a,b,c,d,*p; p=)时,p就指向变量a,相当于p=&a。,(第二章 C语言的数据类型、运算符及其表达式),课件制作:刘达明三、 赋值运算符和赋值表达式,第三节 运算符和表达式,46 / 71,两个指针变量之间的算术运算 两个指针变量之间只有减法(-)运算。只有指向同一数组的两个指针变量之间才能进行这种运算,否则两个指针变量之间的运算毫无意义(但在程序中不会

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论