已阅读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组成,可以带正负号。十六进制整数:如:0 x123、0X119、0 x8f、-0 x1E、0 x0等。它们是以数字0和字母x联合组成的0 x或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表示该常量为longdouble型。如: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=11b=33如果不带n字符,则输出:a=11c=338进制:101表A。16进制:x41表A。,(第二章C语言的数据类型、运算符及其表达式),课件制作:刘达、字符串常量,第一节C的数据类型及常量数据,6/71,字符串常量是一对双引号“”括起来的字符序列。如:“howdoyoudo!”、“a”、“123”。C规定:在每一个字符串的结尾加一个“字符串结束标志”(为字符0),以便系统据此判断字符串是否结束。0是一个ASCII码为0的字符,从ASCII代码表中可以看到ASCII码为0的字符是“空操作符”,即它不引起任何控制动作,也不是一个可显示字符。特别注意:用一对单引号括起来的是字符,它只占一个字节。而一对双引号“”括起来的是字符串,它占至少两个字节,在字符串结尾处有空字符0。在C语言中,没有专门的字符串变量,如果想将一个字符串存放在变量中,必须使用字符型数组。,(第二章C语言的数据类型、运算符及其表达式),课件制作:刘达2、符号常量,第一节C的数据类型及常量数据,7/71,符号常量是指用一个标识符代表的常量,即标识符形式的常量。定义符号常量的方法是用#define命令把一个常量名和常量联系起来,符号常量的使用给调试程序带来很大的方便。符号常量的值在其作用域内不能改变,也不能重新赋值。如:#defineN5表示N代表常量5。习惯上,符号常量名用大写,变量名用小写,以示区别。使用符号常量有如下好处:第一,含义清楚。第二,在需要改变一个常量时能做到“一改全改”。,(第二章C语言的数据类型、运算符及其表达式),课件制作:刘达例2.1:,第一节C的数据类型及常量数据,8/71,(第二章C语言的数据类型、运算符及其表达式),#include#definePRICE30main()intnum,total;num=10;total=num*PRICE;printf(“total=%dn”,total);程序运行结果为:total=300,#define命令出现在程序中函数的外面,其有效范围为定义命令之后到文源文件结束。通常,#define命令写在文件开头,函数之前作为文件一部分,其作用域为整个文件。如例2.1。当然也可以用#undef命令终止#define的作用域。如例2.2。,例2.2:#include#defineTEMP100main()#undefTEMPf1(),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程序编译时,会根据变量的数据类型为每个变量划出一定数目的存储单元存放变量的值,变量所占据的存储单元的起始地址就是变量的地址。变量的地址表示为:则则scanf(“%d,%d”,(第二章C语言的数据类型、运算符及其表达式),课件制作:刘达2、变量的分类,第二节变量及其类型,12/71,根据所声明的位置不同,变量可分为局部变量、形式参数和全局变量。变量可以在程序中三个地方声明:函数内部、函数的参数定义中或所有的函数外部。根据变量存储类型,变量可分为自动变量(用auto声明)、静态变量(用static声明)、外部变量(用extern声明)和寄存器变量(用register声明)。声明变量时,如果不指定存储类型,则其缺省的存储类型为自动变量。因此,定义自动变量时不必使用auto声明。我们使用的大多数变量都属于自动变量存储类型。根据数据类型,变量可分为整型变量(用int、long等声明)、实型变量(用float、double等声明)、字符型变量(用char声明)、数组变量、指针型变量、结构体变量(用struct声明)、共用体变量(用union声明)、枚举类型变量(用enum声明)。,(第二章C语言的数据类型、运算符及其表达式),课件制作:刘达3、变量的声明和赋值,第二节变量及其类型,13/71,变量的声明方法:类型名;如:inti,j,k;chara,b,c;,(第二章C语言的数据类型、运算符及其表达式),变量赋初值的方法:如:inti=3,j;chara=A,c;j=10;c=9;,注意:在C语言中,要求对所有用到的变量做强制定义,也就是说“先定义,后使用”,这样做有如下好处:凡是未被事先定义的,不做变量名,保证程序中变量名不至于前后书写不一致。每一变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。指定每一变量属于一个类型,这就便于在编译时,据此检查该变量所进行的运算是否合法。如:整型变量a和b可以进行求余运算:a%b,得到a/b的余数。但如果将a和b指定为实型变量的话,则不允许进行“求余”运算。,课件制作:刘达二、基本数据类型变量,第二节变量及其类型,14/71,1、整型变量整型变量在内存中的存放形式数据在内存中是以二进制形式存放的。整型变量是用来存放整型数据的变量,而整型数据在计算机内存中以补码形式存放的。(一个正数的补码和其原码相同。而负数的补码是将该值的绝对值的二进制形式,按位取反再加1。),当符号位sf为0时,表示该数为正数;当sf为1时,表示该数为负数。例如:inti=10,j=-10;的存储方式见图a和图b。图a表示存放示意图,图b是数据在内存中的实际存放情况。整型数为16位二进制数。,(第二章C语言的数据类型、运算符及其表达式),课件制作:刘达有符号整型数据和无符号整型数据的存储:,第二节变量及其类型,15/71,有符号整数的范围-3276832767,无符号整数的范围065535。无符号整数使用unsigned修饰。在声明变量时,如果不指定unsigned或指定signed,则表示有符号型数据,符号位有效。如果指定unsigned,则表示无符号型数据,符号位为该数本身。,(第二章C语言的数据类型、运算符及其表达式),如:inta,b;a=32767;b=-1;unsignedintc;c=65535;,课件制作:刘达、整型变量的分类,第二节变量及其类型,16/71,有符号整型变量基本型:一般占2个字节(16位),int短整型:一般占2个字节(16位),shortint长整型:一般占4个字节(32位),longint有符号整型变量使用signed修饰,但缺省的数据类型即表示有符号整型数据,因此可以省略修饰符signed。无符号整型变量无符号基本型:一般占2个字节(16位),unsignedint无符号短整型:一般占2个字节(16位),unsignedshortint无符号长整型:一般占4个字节(32位),unsignedlongint,(第二章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,每个变量使用前必须定义,一般放在函数的开头的声明部分定义变量。如:定义:inta,b;shorti,j;longx,y;/*定义有符号整型变量*/unsignedintc,d;unsignedshorte,f;unsignedlongs,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,则认为是unsignedint型,如:123u。如果写成-12345u,则先将-12345转换成其补码53191,然后再按无符号数存储。如:unsignedinta=-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()inta=32767,b;longc;b=a+1;c=(long)a+1L;printf(“a=%d,b=%d,c=%ld”,a,b,c);运行结果为:32767,-32768,32768,例2.4:main()intx=-1;unsignedinty;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)、长双精度(longdouble)型三种。下表列出了微机上常用的C编译系统(如TurboC、MSC、BorlandC)的实型数据的情况。注意:不同的系统、不同的资料会有所差异,浮点数的内部表示与机器的硬件结构相关,是最少被计算机标准化的内容之一,对特定的编译器都应阅读其文档资料以了解float和double的精度和范围(在ANSI中的limits.h也有列示)。,(第二章C语言的数据类型、运算符及其表达式),如:float是7位有效数字,floata=7758.521125;a的后3位不其作用,实际上输出a=7758.520996。double有效数字为15位,也有类似问题。longdouble型有效数字为19位,用得很少,这里不作介绍。,课件制作:刘达、实型变量的定义与赋值,第二节变量及其类型,23/71,每个变量使用前必须定义,一般放在函数的开头的声明部分定义变量。如:定义:floata,b;doublei,j;longdoublex,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:floata;doubleb;当它赋给a时,只有前7位有效,即a=7865.549,后几位不起作用。当它赋给b时,全部有效,即b=7865.54986621116。,(第二章C语言的数据类型、运算符及其表达式),课件制作:刘达、实型数据的舍入误差,第二节变量及其类型,24/71,由于实型变量是用有限的存储单元存储的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去,由此可能会产生一些误差。,(第二章C语言的数据类型、运算符及其表达式),例2.5:main()floata,b;a=123456.789e5;b=a+20.0f;printf(“a=%fnb=%fn”,a,b);运行结果:a=12345678848.000000b=12345678848.000000,输出结果是a与b相等。虽然理论上b应比a大20,应为12345678920。而实型变量只能保证7位有效数字,后面的数字是无意义的,并不准确地表示该数。因此应该避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数。同样,计算1.0/3.0*3.0的结果并不等于1。,课件制作:刘达3、字符型变量,第二节变量及其类型,25/71,字符型变量的存放形式字符型变量用来存放字符型常量。一个字符变量只能存放一个字符,要存放字符串(包括若干字符)必须声明字符数组。在所有编译系统中,都规定用一个字节来存放一个字符,或者说一个字符变量在内存中占一个字节。将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII码放到存储单元中。因此其存储方式类似于整型变量。,(第二章C语言的数据类型、运算符及其表达式),如:charc1=a,c2=b;/*a的ASCII为97b的ASCII为98*/,ASCII的取值范围为0255的整型常数,其中0127为基本ASCII码,128255为扩展ASCII码。C语言规定,在0255范围内,字符型与整型数据是等价的,是可以互相转换的。如:chara=0,b=97;inti=10,j=b;,课件制作:刘达、字符变量的定义与赋值,第二节变量及其类型,26/71,字符型变量加上不同的修饰符,可以定义有符号和无符号两种类型的字符型变量,其定义方式如下:chara,b,c;/*定义变量a,b,c都为有符号字符型变量*/unsignedcharx,y,z;/*定义变量x,y,z都为无符号字符型变量*/由于字符在计算机中以其ASCII码方式表示,其长度为1个字节。因此有符号字符型数据转换成整型数据时其取值范围为-128127,无符号字符型数据转换成整型数据时其取值范围是0255。作为字符型本身输出时,其ASCII码范围仍然是0255。也就是说,作为字符本身的定义没有必要加unsigned修饰符,而作为与整型数的转换则非常有必要了。字符变量的赋值:如:a=65;b=B;c=,(第二章C语言的数据类型、运算符及其表达式),例2.6:main()charc1=a,c2=b;/*等价于charc1=97,c2=98;*/c1=c1-32;c2=c2-32;printf(“%d,%cn”,c1,c1);printf(“%d,%cn”,c2,c2);,输出结果为:65,A66,B,课件制作:刘达三、指向基本数据类型变量的指针变量,第二节变量及其类型,27/71,1、地址和指针的概念在内存区中,系统对每一个存储单元(即每一个字节)都有一个编号,这个编号就是“地址”。如右图中的2000、2002、2004等。在地址所标志的内存单元中存放数据。如定义inti=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_pointer=3;是等价的。,课件制作:刘达3、指针变量的定义,第二节变量及其类型,31/71,(第二章C语言的数据类型、运算符及其表达式),C语言规定所有变量在使用前必须指定数据类型,并按此分配内存单元。指针变量不同于整型变量和其他类型的变量,它是专门存放地址的,必须将它定义为“指针变量”。定义指针变量的一般形式为:数据类型名*指针变量名;如:inti,j,*p1,*p2;p1和p2可以指向变量i或j。p1=C规定使用/*p1定义指针变量*/p1=/*p1为a的值*/运行结果为:100,10100,10,课件制作:刘达例2.8:输入a和b两个整数,按先大后小的顺序输出a和b.,第二节变量及其类型,33/71,(第二章C语言的数据类型、运算符及其表达式),程序1:main()inta,b,*p1,*p2,*p;scanf(“%d,%d”,运算结果为:10,56(按回车键)a=10,b=56max=56,min=10,程序2:main()inta,b,max,min;scanf(“%d,%d”,运算结果为:10,56(按回车键)a=10,b=56max=56,min=10,课件制作:刘达5、指针的优缺点,第二节变量及其类型,34/71,(第二章C语言的数据类型、运算符及其表达式),指针是一种特殊的数据类型,在其它语言中一般没有。指针是C语言中的一个重要的概念,也是C语言的一个重要特色。指针有如下特点:提高程序效率;能有效地表示复杂的数据结构;能动态分配内存;能方便地使用字符串;能有效而方便地使用数组;能直接处理内存;在调用函数时,能得到多于一个的值等。掌握指针的应用,可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人,都应当深入地学习和掌握指针。可以说,不掌握指针,就是没有掌握C的精华。指针使用非常灵活,对熟悉的程序员来说,可以利用它编写出很有特色的、质量优良的,实现许多用其他高级语言难以实现的功能。但也十分容易出错,而且这种错误往往难以发现。如:未对指针变量p赋值,就向*p赋值,这就可能破坏了有用的单元内容。指针是有利有弊的工具,在使用时要十分谨慎,要多上机,弄清一些细节,并积累经验。,课件制作:刘达四、空类型(void)和void指针类型,第二节变量及其类型,35/71,(第二章C语言的数据类型、运算符及其表达式),空类型字节长度为0,主要有两个用途:一是明确地表示一个函数不返回任何值;一是产生一个同一类型指针(可根据需要动态分配给其内存)。将一个函数定义为空类型(void),并不是指函数没有类型,而是不用该函数返回值。在函数中,凡是不要求返回函数值的函数,一般应定义为void类型,以避免程序出错。如:voiddisplay()printf(“Thisisdemoprogram.”);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.58765.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语言的运算符范围很宽,它把除了控制语句和输入输出外的几乎所有的基本操作都作为运算符处理。算术运算符:+、-、*、/、%、+、-关系运算符:、=、|、(int)x;。强制类型转换用途之一是整型量运算时,其结果需保留小数时可对其中一个强制为float或double型,在运算前系统会自动将两个操作数转换为flaot或double型,运算结果也是float或double型。如:inti=10,j=4,k;floatx=3.6,f;k=(int)x;f=i/j;则有:x=3.600000f=2.000000k=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()intx,y;x=10;y=+x;printf(“%d,%dn”,x,y);运算结果为:11,11自增自减运算符常用于循环语句中,使循环变量自动加(减)1。,课件制作:刘达5、表达式的求值顺序,第三节运算符和表达式,44/71,ANSIC并没有规定表达式中的子表达式求值顺序,允许编译系统自己安排。如: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标准并无统一规定。如:inti=3;printf(“%d,%d”,i,i+);如果“从左至右”求值,其结果为:3,3。如果“自右而左”求值,其结果为:4,3。为了避免这种情况发生,最好改写成:inti=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表示整型数据)。这些运算的结果仍为指针。例如:inta,b,c,d,*p;p=)时,p就指向变量a,相当于p=i=3;floatk;k=7.8;指针变量的赋值:inti,*p1,*p2;p1=,(第二章C语言的数据类型、运算符及其表达式),课件制作:刘达3、复合运算符,第三节运算符和表达式,47/71,(第二章C语言的数据类型、运算符及其表达式),C语言规定除了“=”赋值运算符外,还有10种复合赋值运算符。+=如:a+=6;相当于a=a+6;,即将a+移到等号=的紧跟的后面-=如:a-=10;相当于a=a-10;*=如:a*=b;相当于a=a*b;/=如:a/=5;相当于a=a/5;%=如:a%=12;相当于a=a%12;=如:a=c;相当于a=ac;赋值运算符是双目运算符,处于同一优先级,优先级别为14,其结合方向为自右至左。,课件制作:刘达4、赋值表达式,第三节运算符和表达式,48/71,(第二章C语言的数据类型、运算符及其表达式),由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。其一般形式为:如:a=8;,对赋值表达式求解的过程是:将赋值符右侧的“表达式”的值赋给左侧的变量。除了以上格式外,还有如下形式的“多重赋值表达式”:变量1=变量2=变量3=。=变量n=表达式赋值运算符的结合性是自右向左。赋值表达式的值等于被赋值变量的值。如:a=b=c=5;/*赋值表达式的值为5,变量a,b,c的值均为5*/a=5+(b=6);/*表达式的值为11,a值为5,b值为6*/a=(b=10)/(c=2);/*表达式的值为5,a值为5,b值为10,b值为2*/赋值表达式也可以包含复合赋值运算符。如:a+=a-=a*a,也是一个赋值表达式。如果a的初值为12,此表达式的求解过程为:先进行“a-=a*a”运算,它相当于a=a-a*a=-132。再进行“a+=-132”的计算,它相当于a=a+(-132)=-264。将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中。,课件制作:刘达四、逗号运算符和逗号表达式,第三节运算符和表达式,49/71,(第二章C语言的数据类型、运算符及其表达式),在C语言中,逗号“,”有两种用法:一种是作为分隔符使用,另一种是作为运算符使用。逗号作为分隔符使用时有:变量声明语句,各变量间使用逗号分隔:inti,j,k;;在函数调用时,函数参数之间使用逗号分隔:scanf(%d,%d”,其结果为:x的值为:45,y的值为:9,z的值为:8。,课件制作:刘达五、关系运算符和关系表达式,第三节运算符和表达式,50/71,(第二章C语言的数据类型、运算符及其表达式),1、关系运算符关系运算符是比较两个操作数大小的符号。关系运算实际上是比较运算。将两个值进行比较,判断其比较的结果是否符合给定的条件。如果满足,关系表达式的值即为“真”,如果不满足,关系表达式的值即为“假”。在C中true可以是不为0的任何值,而false则为0。C语言提供6种关系运算符:,使用关系运算符表达式时,若表达式为真true,则返回1,否则表达式为假false,则返回0。,课件制作:刘达2、关系表达式,第三节运算符和表达式,51/71,用关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的有意义的式子称为关系表达式。关系表达式的形式如下:如:10(2+10),a+bb+c,ab)c则返回1。两个指针变量之间的比较(关系运算):两个指针之间关系运算是比较两个指针所指向的地址关系,其运算符有:=、!=、=。比较运算结果为:真(1)或假(0)。如:p1=则:p1=p2为假(0),p1!=p2为真(1),p1p2为假。当p1=p2时,表示p1、p2指向同一数组元素地址。当p1p2时表示p1比p2的地址值大,在高地址位置。当p1b)?a:b;,min=(ab?a:b;表达式:ab?a:cd?c:d;由“自右向左”可知,它相当于:ab?a:(cd?c:d);条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。当表达式2与表达式3的类型不同时,条件表达式的值的类型为二者中较高的类型。如:xy?1:1.5;条件表达式的值为1.0或1.5。,课件制作:刘达第2章C语言的数据类型、运算符及其表达式-习题3,58/71,C语言程序设计龙昭华主编,习题(三)*复习本章已讲内容,预习本章剩余内容和第三章内容。2.2教材P38的习题2.4中的全部小题,即2.4中的、。,课件制作:刘达十、位运算符,第三节运算符和表达式,59/71,(第二章C语言的数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 讲解员操作评估模拟考核试卷含答案
- 2025年下半年教师资格证考试《综合素质》(中学)真题(解析)附答案
- 2025年全国计算机等级考试一级笔试真题解析及答案
- 2025年上半年教师资格证考试《保教知识与能力》(幼儿园)题及答案
- 2026年秋季开学高中开学第一课(时间管理)课件
- 2026年秋季开学高三开局即冲刺动员大会课件
- 2026年秋季开学初中物理启蒙心理健康讲座课件
- 2024年嵌入式面试试题(附答案)
- 2026浙江省教师职称考试(物理)历年参考题库含答案详解3卷
- 2026浙江卫生系统招聘考试(英语)历年参考题库含答案详解3卷
- 民宿员工聘用合同范本
- 企业级BOM培训课件
- 主井提升培训课件
- 浙江金石亚药医药科技有限公司迁扩建项目环评报告
- 酒店安全巡查日常检查记录表
- 招商岗位测试题及答案
- 医院后勤管理与设备职责
- 《左传》完整版本
- 周三多-管理学:原理与方法(第七版),第三章
- 无人机遥感图像融合
- 高考英语复习读后续写练习 善举篇 改变家乡为无法使用操场的孩子们带来福音 课件
评论
0/150
提交评论