C语言的数据类型

上传人:pu****.1 文档编号:578717980 上传时间:2024-08-24 格式:PPT 页数:71 大小:1.39MB
返回 下载 相关 举报
C语言的数据类型_第1页
第1页 / 共71页
C语言的数据类型_第2页
第2页 / 共71页
C语言的数据类型_第3页
第3页 / 共71页
C语言的数据类型_第4页
第4页 / 共71页
C语言的数据类型_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《C语言的数据类型》由会员分享,可在线阅读,更多相关《C语言的数据类型(71页珍藏版)》请在金锄头文库上搜索。

1、第第2章章C语言的数据类型、运算符及其表达式语言的数据类型、运算符及其表达式第一节第一节C的数据类型及常量数据的数据类型及常量数据第二节第二节变量及其类型变量及其类型第三节第三节运算符和表达式运算符和表达式1/71C语言程序设计语言程序设计 龙昭华主编课件制作:刘达明课件制作:刘达明023-66834110第一节第一节C的数据类型及常量数据的数据类型及常量数据(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)2/71由于“程序=算法+数据结构”,算法处理的对象是数据,而数据是以某种特定的形式存在的(如整数、实数、字符等)。不同的数据之间往往还存在某些联系(

2、如若干整数组成一个整数数组)。所谓数据结构数据结构指的是数据的组织形式,如数组就是一种数据结构。不同的计算机语言所允许定义和使用的数据结构是不同的,处理同一类问题如果数据结构不同,算法也会不同。因此考虑算法时,必须注意数据结构。一、一、 C C的数据类型分类的数据类型分类空空类类型型(void)指针类型指针类型(*)数据类型数据类型基本类型基本类型整型整型(int)字符型字符型(char)枚枚 举举 类类 型型 (新新 增增 加加 的的)(enum)实型实型(浮点型浮点型)双精度型双精度型(double)单单 精精 度度 型型(float)构造类型构造类型数组类型数组类型结结 构构 体体 类类

3、 型型(struct)共用体类型共用体类型(union)实际上,应当综合考虑算法和数据结构,选择最佳的数据结构和算法。C语言的数据结构数据结构是以数数据类型据类型形式出现的。C的数据类型分类如右边所示:课件制作:刘达明课件制作:刘达明023-66834110二、二、常量及其类型常量及其类型第一节第一节C的数据类型及常量数据的数据类型及常量数据3/71在程序运行过程中,其值不能被改变的量称为常量。常量。 1 1、直接常量、直接常量常量一般从其字面形式即可判断,这种常量称为字面常量或直接常量。常量分为以下不同类型: 、整型常量、整型常量 即整常数,它在C中有三种表示方法: 十进制整数十进制整数:如

4、: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语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件

5、制作:刘达明023-66834110、实型常量实型常量第一节第一节C的数据类型及常量数据的数据类型及常量数据4/71 实型常量又称浮点数,它即数学里的实数,在C中有两种表示方法: 十进制小数形式十进制小数形式:它由数字09和小数点组成(注意必须有小数点.),可以带正负号。如:.123、56.、89.0、-456.32、0.0、-.9、0.78、-0.99等。 指数形式指数形式:也称科学表示法。如:123e3或123E3都代表123*10123*103 3。 注意:字母e或E之前必须有数字,且字母e或E之后的指数必须是整数。 一个实数可以有多种指数表示形式,如:123.456可以表示为123.4

6、56e0、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

7、表示不同的数据类型。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明023-66834110、字符型常量、字符型常量第一节第一节C的数据类型及常量数据的数据类型及常量数据5/71 C的字符型常量是用单引号单引号括起来的一个字符。(注意是单引号) 如:A、a、D、*、$、0等。注意:A和a是两个不同的字符常量。 除了以上形式的字符常量外,C语言还有一种特殊的字符常量转义字符。它以“”开头,使用时用一对单引号将其括起来。如n表示回车换行字符,即键盘上的“Enter”键。字符形式字符形式功能含义功能含义十六进制值十六进制值ASI

8、CII代码代码等效按键等效按键n换行换行,将当前位置,将当前位置移到移到下一行开头下一行开头0x0A10Ctrl+Jt横向跳格横向跳格(跳到下一个跳到下一个tab位置位置)0x099Ctrl+Iv竖向跳格竖向跳格0x0B11Ctrl+Kb退格,将当前位置移到前一列退格,将当前位置移到前一列0x088Ctrl+Hr回车,将当前位置移到本行开头回车,将当前位置移到本行开头0x0D13Ctrl+Mf走纸换走纸换页,将当前位置移到下页开头页,将当前位置移到下页开头0x0C12Ctrl+L反斜杠反斜杠0x5C92单引号字符单引号字符0x2739?问号字符问号字符0x3F63?”双引号字符双引号字符0x2

9、234“a报警响铃报警响铃0x077Ctrl+G0空空0x000Ctrl+ddd13位八进制数所代表的字符位八进制数所代表的字符xhh12位十六进制数所代表的字符位十六进制数所代表的字符如:如:printf(“a=11n”);printf(“c=33”);输出结果为:输出结果为:a=11b=33如果不带如果不带n字符,字符,则输出:则输出:a=11c=338进制:进制:101表表A。16进制:进制:x41表表A。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明023-66834110、字符串常量、字符串常量第一节第一节C的

10、数据类型及常量数据的数据类型及常量数据6/71 字符串常量字符串常量是一对双引号“”括起来的字符序列。如: “how do you do!”、“a”、“123”。 C规定:在每一个字符串的结尾加一个“字符串结束标志”(为字符0),以便系统据此判断字符串是否结束。0是一个ASCII码为0的字符,从ASCII代码表中可以看到ASCII码为0的字符是“空操作符”,即它不引起任何控制动作,也不是一个可显示字符。 特别注意特别注意:用一对单引号括起来的是字符,它只占一个字节。而一对双引号“”括起来的是字符串,它占至少两个字节,在字符串结尾处有空字符0。在C语言中,没有专门的字符串变量,如果想将一个字符串

11、存放在变量中,必须使用字符型数组。a0字字 符符 串串”a”存储时占存储时占2个字节个字节a字字 符符a存储时占存储时占1个字节个字节c0字字符符串串”china”存储时占存储时占6个字节个字节hina(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明023-668341102 2、符号常量、符号常量第一节第一节C的数据类型及常量数据的数据类型及常量数据7/71 符号常量是指用一个标识符代表的常量,即标识符形式的常量。 定义符号常量的方法是用# #definedefine命令把一个常量名和常量联系起来,符号常量的使用给调试程

12、序带来很大的方便。符号常量的值在其作用域内不能改变,也不能重新赋值。如: #define N 5表示N代表常量5。 习惯上,符号常量名用大写,变量名用小写,以示区别。 使用符号常量有如下好处:第一,含义清楚。第二,在需要改变一个常量时能做到“一改全改”。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明023-66834110例例2.1:第一节第一节C的数据类型及常量数据的数据类型及常量数据8/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)#include #define PRI

13、CE 30main() int num,total; num=10; total=num*PRICE; printf(“total=%dn”,total);程序运行结果为:total=300#define命令出现在程序中函数的外面,其有效范围为定义命令之后有效范围为定义命令之后到文源文件结束到文源文件结束。通常,#define命令写在文件开头,函数之前作为文件一部分,其作用域为整个文件。如例2.1。当然也可以用#undef命令终止#define的作用域。如例2.2。例例 2.2 2.2:#include #define TEMP 100main() #undef TEMPf1()TEMP的作用

14、域课件制作:刘达明课件制作:刘达明023-66834110第第2章章C语言的数据类型、运算符及其表达式语言的数据类型、运算符及其表达式-习题习题19/71C语言程序设计语言程序设计 龙昭华主编习习题题(一一)*复习本章已讲内容,预习本章剩余内容。复习本章已讲内容,预习本章剩余内容。课件制作:刘达明课件制作:刘达明023-66834110第二节第二节变量及其类型变量及其类型10/71一、一、 变量及其分类变量及其分类 1 1、变量的概念、变量的概念 变量变量是指在程序运行过程中,其值可以改变的量。变量具有三要素:变量变量名名、变量值变量值、变量地址变量地址(即变量存储单元的首地址)。即一个变量应

15、该有一个名字,在内存中占据一定的存储单元,在该存储单元中存放变量的值。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)变量名实际上是一个符号地址,在对程序编译时,由系统给每个变量名分配一个内存地址。在程序中从变量中读值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。变量要先定义后使用变量要先定义后使用。变量名变量名是标识符标识符(用来标识变量、符号常量、函数名、数组名、类型名、文件名等的有效字符序列)的一种,它是由字母、数字、下划线三种字符组成的,且第3a变量名变量名变量值变量值存储单元存储单元一个字符必须为字母或下划线,其长度不要超过8

16、个字符(MSC)或32个字符(TurboC)。为了通用,建议不要超过8个字符。对于一般用来表示整数变量和临时变量的单字符变量名,由于易与数字1和0混淆,而不使用字母l和o,单字符变量一般使用i、j、k、m、n。课件制作:刘达明课件制作:刘达明023-66834110变量值:变量值:第二节第二节变量及其类型变量及其类型11/71 变量是用来存放数据的,由于数据有不同的类型,因此要定义相应类型的变量来存放它。对某变量规定数据类型,实际上是对该变量内存中存放的二进制数值按照相应数据类型的规定进行相应的值解释而已。 变量地址变量地址:在C程序编译时,会根据变量的数据类型为每个变量划出一定数目的存储单元

17、存放变量的值,变量所占据的存储单元的起始地址起始地址就是变量的地址。 变量的地址表示为:&变量名D199920002001 例如:char a=D; 则&a就是字符变量a的地址,如右图所示:字符变量a的地址为2000,字符变量a的值就存放在2000单元中。 例如:int n=108; 则&n就是整型变量n的地址,如右图所示:整型变量n的地址3002,但整型变量n的值就存储在存储单元3002和3003两个字节中。1083001300230033004例如: int a,b; scanf(“%d , %d”,&a,&b);(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符

18、及其表达式)课件制作:刘达明课件制作:刘达明023-668341102 2、变量的分类、变量的分类第二节第二节变量及其类型变量及其类型12/71根据所声明的位置不同根据所声明的位置不同,变量可分为局部变量局部变量、形式参数形式参数和全局变量全局变量。变量可以在程序中三个地方声明:函数内部、函数的参数定义中或所有的函数外部。根据变量存储类型根据变量存储类型,变量可分为自动变量自动变量(用auto声明)、静态变量静态变量(用static声明)、外部变量外部变量(用extern声明)和寄存器变量寄存器变量(用register声明)。声明变量时,如果不指定存储类型,则其缺省的存储类型为自动变量。因此,

19、定义自动变量时不必使用auto声明。我们使用的大多数变量都属于自动变量存储类型。根据数据类型根据数据类型,变量可分为整型变量整型变量(用int、long等声明)、实型变量实型变量(用float、double等声明)、字符型变量字符型变量(用char声明)、数组变量、指针型变量、结数组变量、指针型变量、结构体变量构体变量(用struct声明)、共用体变量共用体变量(用union声明)、枚举类型变量枚举类型变量(用enum声明)。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明023-668341103 3、变量的声明和赋值、

20、变量的声明和赋值第二节第二节变量及其类型变量及其类型13/71变量的声明方法变量的声明方法:类型名;如:inti,j,k;chara,b,c;(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)变量赋初值的方法变量赋初值的方法:如:inti=3,j;chara=A,c;j=10;c=9;注意:注意:在C语言中,要求对所有用到的变量做强制定义,也就是说“先定义,后使用”,这样做有如下好处:凡是未被事先定义的,不做变量名,保证程序中变量名不至于前后书写不一致。 每一变量被指定为一确定类型,在编译时就能为其分配相应的存储单元。 指定每一变量属于一个类型,这就便于在

21、编译时,据此检查该变量所进行的运算是否合法。如:整型变量a和b可以进行求余运算:a%b ,得到 a/b 的余数。但如果将a和b指定为实型变量的话,则不允许进行“求余”运算。课件制作:刘达明课件制作:刘达明023-66834110二、二、 基本数据类型变量基本数据类型变量第二节第二节变量及其类型变量及其类型14/71 1 1、整型变量、整型变量 整型变量在内存中的存放形式整型变量在内存中的存放形式 数据在内存中是以二进制二进制形式存放的。整型变量整型变量是用来存放整型数据整型数据的变量,而整型数据在计算机内存中以补码形式存放补码形式存放的。(一个正数的补码和其原码相同。而负数的补码是将该值的绝对

22、值的二进制形式,按位取反再加1。)SfS1S2S3Sn符号位符号位整数的数值部分整数的数值部分当符号位sf为0时,表示该数为正数;当sf为1时,表示该数为负数。例如:inti=10,j=-10;的存储方式见图a和图b。图a表示存放示意图,图b是数据在内存中的实际存放情况。整型数为16位二进制数。10ai0bi000000000001010-10aj1bj111111111110110(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明023-66834110有符号整型数据和无符号整型数据的存储:有符号整型数据和无符号整型数据的

23、存储:第二节第二节变量及其类型变量及其类型15/71 有符号整数的范围-3276832767-3276832767,无符号整数的范围065535065535。无符号整数使用unsigned修饰。在声明变量时,如果不指定unsigned或指定signed,则表示有符号型数据,符号位有效。如果指定unsigned,则表示无符号型数据,符号位为该数本身。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)032767有符号整型有符号整型变量变量a:111111111111111符号位符号位165535无符号整型无符号整型变量变量c:111111111111111代

24、表数据代表数据的第一位的第一位1-1有符号整型有符号整型变量变量b:111111111111111如:如:intint a,b; a,b;a=32767;a=32767;b=-1;b=-1;unsigned unsigned intint c; c;c=65535;课件制作:刘达明课件制作:刘达明023-66834110、整型变量的分类、整型变量的分类第二节第二节变量及其类型变量及其类型16/71 有符号整型变量有符号整型变量 基本型:一般占2个字节(16位),int 短整型:一般占2个字节(16位),short int 长整型:一般占4个字节(32位),long int 有符号整型变量使用s

25、igned修饰,但缺省的数据类型即表示有符号整型数据,因此可以省略修饰符signed。 无符号整型变量无符号整型变量 无符号基本型:一般占2个字节(16位),unsigned int 无符号短整型:一般占2个字节(16位),unsigned short int 无符号长整型:一般占4个字节(32位),unsigned long int(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明023-66834110、整型变量长度、整型变量长度第二节第二节变量及其类型变量及其类型17/71 C标准没有具体规定整型变量各类型数据所占内存

26、字节数,只要求long型数据长度不短于int型,short型不长于int型。具体如何实现,由各计算机系统及C系统自行决定。 各种计算机的数据字长各种计算机的数据字长IBMPCVAX750IBM370HPHoneywellshortint1616161636int1632323236longint3232323236 在C系统中,通常把long定义为32位,把short定义为16位,而int可以是16位或32位,主要取决于机器字长,一般以一个机器字word存放一个int数据。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明0

27、23-66834110各种整型数据在各种整型数据在C C系统中的长度及取值范围系统中的长度及取值范围第二节第二节变量及其类型变量及其类型18/71 ANSI标准建议各种整型数据所占位数和数值范围如右表所示(TurboC与该表定义一致):注意注意: 在微机上用long型可以得到大范围的整数,但同时会降低运算速度,因此除非不得已,不要随便使用long型数据。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)类型类型名称名称比特比特数数最小取值范围最小取值范围signedshortint有符号短有符号短整型整型16-3276832767即即-215(215-1)

28、signedint有符号基有符号基本整型本整型16-3276832767即即-215(215-1)signedlongint有符号长有符号长整型整型32-2147483648-2147483647即即-231(231-1)unsignedshortint无符号短无符号短整型整型16065535即即0(216-1)unsignedint无符号基无符号基本整型本整型16065535即即0(216-1)unsignedlongint无符号长无符号长整型整型3204294967295即即0(232-1)课件制作:刘达明课件制作:刘达明023-66834110、整型变量的定义与赋值、整型变量的定义与赋值

29、第二节第二节变量及其类型变量及其类型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型。一个超过了-327683276

30、7范围内的整数,而在-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语言的数据类型

31、、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明023-66834110、整型数据的溢出、整型数据的溢出第二节第二节变量及其类型变量及其类型20/71一个int型变量的最大允许值为:32767。如果再加1,则结果会变成-32768。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)032767a:1111111111111111-32768b:000000000000000例例2.3:main()inta=32767,b;longc;b=a+1;c=(long)a+1L;printf(“a=%d,b=%d,c=%ld”

32、,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,则输出负数。课件制作:刘达明课件制作:刘达明023-668341102 2、实型变量、实型变量第二节第二节变量及其类型变量及其类型21/71 实型数据在内存中的存放形式实型数据在内存中的存放形式 存放实数存放实数的变量就是实型变量实型变量。一个实型变量在内存中是按浮点数指数形浮点数指数形式存放式存放

33、的。系统把一个实型数据分成小数部分小数部分和指数部分指数部分,分别存放。指数部分采用规范化的指数形式。常用的微机系统中一个实型数据在内存中占4个字节(32位),在这32位中,究竟用多少位来表示小数部分,多少位来表示指数部分,标准C并无规定,由各C编译系统自定。不少C编译系统以以2424位表示小数部分位表示小数部分(包括符号),以以8 8位表示指数部分位表示指数部分(包括指数的符号)。小数部分占的位(bit)数愈多,数的有效数字就越多,精度愈高。指数部分占的位数越多,则能表示的数值范围就越大。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)+.314159

34、2+.314159* * 102符号符号小数部分小数部分指数指数31.4159 如实数:31.4159的指数形式为:.314159*.314159*10102 2 ,它在内存中的存放形式可以表示为右图所示。图中用十进制表示的,实际上在计算机中是用二进制来表示小数部分,用2的幂次来表示指数部分。课件制作:刘达明课件制作:刘达明023-66834110、实型变量的分类及其长度、实型变量的分类及其长度第二节第二节变量及其类型变量及其类型22/71 C的实型变量分为:单精度单精度(float型)、双精度双精度(double)、长双精度长双精度(long double)型三种。下表列出了微机上常用的C编

35、译系统(如TurboC、MSC、Borland C)的实型数据的情况。注意:不同的系统、不同的资料会有所差异,浮点数的内部表示与机器的硬件结构相关,是最少被计算机标准化的内容之一,对特定的编译器都应阅读其文档资料以了解float和double的精度和范围(在ANSI中的limits.h也有列示)。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)类型类型名称名称比特比特数数有效有效数字数字数值范围数值范围float单精度单精度326810-371038double双精度双精度64151610-30710308longdouble长双精长双精度度801819

36、10-4931104932如:float是7位有效数字,floata=7758.521125;a的后3位不其作用,实际上输出a=7758.520996。double有效数字为15位,也有类似问题。longdouble型有效数字为19位,用得很少,这里不作介绍。课件制作:刘达明课件制作:刘达明023-66834110、实型变量的定义与赋值、实型变量的定义与赋值第二节第二节变量及其类型变量及其类型23/71每个变量使用前必须定义,一般放在函数的开头的声明部分定义变量。如:定义:floata,b;doublei,j;longdoublex,y;赋值:a=21.910;b=-20.09832;i=-3

37、0201.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语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作

38、:刘达明课件制作:刘达明023-66834110、实型数据的舍入误差、实型数据的舍入误差第二节第二节变量及其类型变量及其类型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

39、与b相等。虽然理论上b应比a大20,应为12345678920。而实型变量只能保证7位有效数字,后面的数字是无意义的,并不准确地表示该数。因此应该避免将一个很大的数和一个很小的数直接相加或相减,否则就会“丢失”小的数。同样,计算1.0/3.0*3.0的结果并不等于1。课件制作:刘达明课件制作:刘达明023-668341103 3、字符型变量、字符型变量第二节第二节变量及其类型变量及其类型25/71 字符型变量的存放形式字符型变量的存放形式 字符型变量用来存放字符型常量存放字符型常量。 一个字符变量只能存放一个字符,要存放字符串(包括若干字符)必须声明字符数组。在所有编译系统中,都规定用一个字节

40、来存放一个字符,或者说一个字一个字符变量在内存中占一个字节符变量在内存中占一个字节。将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII码放到存储单元中。因此其存储方式类似于整型变量。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)0c1=b1010010980c1=a101000197如:charc1=a,c2=b;/*a的ASCII为97b的ASCII为98*/ASCII的取值范围为0255的整型常数,其中0127为基本ASCII码,128255为扩展ASCII码。C语言规定,在0255范围内,字

41、符型与整型数据是等价的,是可以互相转换的。如:chara=0,b=97;inti=10,j=b;课件制作:刘达明课件制作:刘达明023-66834110、字符变量的定义与赋值字符变量的定义与赋值第二节第二节变量及其类型变量及其类型26/71 字符型变量加上不同的修饰符,可以定义有符号和无符号两种类型的字符型变量,其定义方式如下: char a,b,c; /* 定义变量a,b,c都为有符号字符型变量 */ unsigned char x,y,z; /* 定义变量x,y,z都为无符号字符型变量 */ 由于字符在计算机中以其ASCII码方式表示,其长度为1个字节。因此有符号有符号字符型数据转换成整型

42、数据时其取值范围为字符型数据转换成整型数据时其取值范围为-128127-128127,无符号字符型数据转换无符号字符型数据转换成整型数据时其取值范围是成整型数据时其取值范围是02550255。作为字符型本身输出时,其ASCII码范围仍然是0255。也就是说,作为字符本身的定义没有必要加作为字符本身的定义没有必要加unsignedunsigned修饰符修饰符,而作为与整型数的转换则非常有必要了。 字符变量的赋值:如:a=65; b=B; c=&;(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)例例2.6:main()charc1=a,c2=b;/*等价于c

43、harc1=97,c2=98;*/c1=c1-32;c2=c2-32;printf(“%d,%cn”,c1,c1);printf(“%d,%cn”,c2,c2);输出结果为:65,A66,B课件制作:刘达明课件制作:刘达明023-66834110三、三、 指向基本数据类型变量的指针变量指向基本数据类型变量的指针变量第二节第二节变量及其类型变量及其类型27/71 1 1、地址和指针的概念、地址和指针的概念 在内存区中,系统对每一个存储单元(即每一个字节)都有一个编号,这个编号就是“地址地址”。如右图中的2000、2002、2004等。在地址所标志的内存单元中存放数据。 如定义int i=3,j=

44、6,k=9;三变量,每个变量占2个字节,系统编译时2000和2001两个单元分配给了变量i,因此2000和2001单元中存放数据3。 在程序中,一般是通过变量名来对内存单元进行存取操作,其实程序经过编译后已经将变量名转换为变量的地址变量名转换为变量的地址,对变量值的存取都是通过地址进行的对变量值的存取都是通过地址进行的。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)变量变量i=3内存用户数据区内存用户数据区2000变量变量j=6变量变量k=9变量变量i_pointer2000200220043010000010010000000000000011000

45、000000000011000000000课件制作:刘达明课件制作:刘达明023-66834110直接访问方式:直接访问方式:第二节第二节变量及其类型变量及其类型28/71 直接访问方式直接访问方式是指按变量地址存取变量值按变量地址存取变量值的方式。如读取i的值3,是根据变量名变量名与地址地址的对应关系,找到变量i的地址2000,然后从2000开始的2个字节中取出数据数据,即变量i的值3。如果输入数据时,则是将键盘输入的值送到相应地址的存储单元中。间接访问方式:间接访问方式: 间接访问方式间接访问方式就是将变量的地址变量的地址存放到另一变量另一变量中。取数时,先从另一变量中找到原变量的地址,然

46、后再从该地址中取出该变量的值。按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语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明

47、课件制作:刘达明023-66834110指针指针第二节第二节变量及其类型变量及其类型29/71将数值3送到变量i中,有两种方式: 将3送到变量i所标志的单元中(2000和2001)。这是直接访问方式。 将3送到变量i_pointer所“指向”的单元中(即所标志的单元2000和2001)。所谓“指向”,就是通过地址来体现的。这是间接访问方式。 由于通过地址能找到所需的变量单元,也可以说地址地址“指向指向”该变量单元该变量单元,在C语言中,形象化地称为“指针指针”,意思是通过它能找到以它为地址的内存单元。指针就是地址指针就是地址,地址就是指针。(第二章(第二章 C语言的数据类型、运算符及其表达式)

48、语言的数据类型、运算符及其表达式)20002000i_pointeri30103间接访问:间接访问:2000i3直接访问:直接访问:课件制作:刘达明课件制作:刘达明023-668341102 2、变量的指针、变量的指针第二节第二节变量及其类型变量及其类型30/71 一个变量的地址称为该变量的“指针指针”。如2000是变量i的指针。指针就是地址,变量的指针变量的指针就是变量的地址变量的地址。 存放变量地址(即指针)的变量,就是“指针变量指针变量”,它指向另一个变量。 注意:指针变量的值指针变量的值(即指针变量中存放的值)是指针指针。为了表示指针变量和它所指向的变量之间的联系,在程序中用星号中用星

49、号“*”“*”表示表示“指向指向”。如i_pointer就是一个指针变量,它存放变量i的指针,而*i_pointer是i_pointer所指向的变量。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)200032000i_pointeri3010*i_pointer 指针是指向变量的地址,实质上指针就是存贮单元的地址。指针变量就是专门存放另一变量的的地址的变量。根据所指的变量类型不同,可以有整型指针(int *)、实型指针(float *)、字符型指针(char *)、void指针类型(void *)、结构体指针(struct *)和共用体指针(union

50、 *)等。可以看到*i_pointer也代表一个变量,它和变量i是同一回事。即赋值语句i=3;和*i_pointer=3;是等价的。课件制作:刘达明课件制作:刘达明023-668341103 3、指针变量的定义、指针变量的定义第二节第二节变量及其类型变量及其类型31/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式) C语言规定所有变量在使用前必须指定数据类型,并按此分配内存单元。指针变量不同于整型变量和其他类型的变量,它是专门存放地址的,必须将它定义为“指针变量”。定义指针变量的一般形式为: 数据类型名数据类型名 * *指针变量名指针变量名; ; 如

51、:如:intint i,j,*p1,*p2; i,j,*p1,*p2; p1和p2可以指向变量i或j。 p1=&i; float a,b,*p3,*p4; float a,b,*p3,*p4; p3和p4可以指向变量a或b。 p3=&b; char c,*p5; char c,*p5; p5可以指向变量c。 p5=&c;C规定使用&运算符完成变量与指针变量的指向操作。定义指针变量时注意定义指针变量时注意:指针变量前面的星号*表示该变量的类型为指针变量。特别强调,指针名是p1,而不是*p1。 必须指定数据类型名。因为各种数据类型在内存中所占的字节数不同。 一个指针变量只能指向一个类型的变量。 可

52、以这样理解:*p1是整型变量,如同定义i是整型变量一样。而*p1是p1所指向的变量,p1是指针变量。课件制作:刘达明课件制作:刘达明023-668341104 4、指针变量的引用、指针变量的引用第二节第二节变量及其类型变量及其类型32/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式) 请牢记,指针变量中只能存放地址指针变量中只能存放地址(指针),不要将一个整型量(或其它任何非地址类型的数据)赋给一个指针变量。与指针有关的两个运算符:&和*。 & &:取地址运算符取地址运算符;如:&a为变量a的地址。&运算符只能作用于变量。 * *:指针运算符指针运算

53、符,又称“间接访问”运算符。*p表示指针变量p所指向的变量的存储单元的值。&b&bP2b*p2&a&ap1a*p1例例2.7通过指针变量访问整型变量通过指针变量访问整型变量main()inta=100,b=10,*p1,*p2;/*p1定义指针变量*/p1=&a;/*把变量a的地址赋给指针变量p1*/p2=&b;/*把变量b的地址赋给指针变量p2*/printf(“%d,%dn”,a,b);printf(“%d,%dn”,*p1,*p2);/*p1为a的值*/运行结果为:100,10100,10课件制作:刘达明课件制作:刘达明023-66834110例例 2.8 2.8: : 输入输入a a和

54、和b b两个整数,按先大后小的顺序输出两个整数,按先大后小的顺序输出a a和和b.b.第二节第二节变量及其类型变量及其类型33/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)程序程序1:main()inta,b,*p1,*p2,*p;scanf(“%d,%d”,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(“na=%d,b=%dn”,a,b);printf(“max=%d,min=%dn”,*p1,*p2);运算结果为:10,56(按回车键)a=10,b=56max=56,min=10程序程序2:m

55、ain()inta,b,max,min;scanf(“%d,%d”,&a,&b);if(ab)max=b;min=a;printf(“na=%d,b=%dn”,a,b);printf(“max=%d,min=%dn”,max,min);运算结果为:10,56(按回车键)a=10,b=56max=56,min=10课件制作:刘达明课件制作:刘达明023-668341105 5、指针的优缺点指针的优缺点第二节第二节变量及其类型变量及其类型34/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式) 指针是一种特殊的数据类型,在其它语言中一般没有。指针是C语言中

56、的一个重要的概念,也是C语言的一个重要特色。指针有如下特点:提高程序效率;能有效地表示复杂的数据结构;能动态分配内存;能方便地使用字符串;能有效而方便地使用数组;能直接处理内存;在调用函数时,能得到多于一个的值等。 掌握指针的应用,可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人,都应当深入地学习和掌握指针。可以说,不掌握指针,就是没有掌握C的精华。 指针使用非常灵活,对熟悉的程序员来说,可以利用它编写出很有特色的、质量优良的,实现许多用其他高级语言难以实现的功能。 但也十分容易出错,而且这种错误往往难以发现。如:未对指针变量p赋值,就向*p赋值,这就可能破坏了有用的单元内容。 指针是有

57、利有弊的工具,在使用时要十分谨慎,要多上机,弄清一些细节,并积累经验。课件制作:刘达明课件制作:刘达明023-66834110四、四、 空类型空类型( (void)void)和和voidvoid指针类型指针类型第二节第二节变量及其类型变量及其类型35/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)空类型字节长度为空类型字节长度为0,主要有两个用途:一是明确地表示一个函数不返回任何值;一是产生一个同一类型指针(可根据需要动态分配给其内存)。将一个函数定义为空类型(void),并不是指函数没有类型,而是不用该函数返回值。在函数中,凡是不要求返回函数值的

58、函数,一般应定义为void类型,以避免程序出错。如:voiddisplay()printf(“Thisisdemoprogram.”); ANSI新标准增加了“void”指针类型,该指针不指向任何类型的数据。C规定用动态存储分配函数时返回void指针类型,用来指向一个抽象类型的数据,在将它的值赋给另一指针变量时要进行强制类型的转换,使之适合该变量类型。如:char*p1;/*p1被定义为字符类型指针变量*/void*p2;/*p2被定义为空类型指针变量*/p1=(char*)p2;/*将p2的值强制转换成char*类型。课件制作:刘达明课件制作:刘达明023-66834110五、五、 各类数值

59、型数据间的混合运算各类数值型数据间的混合运算第二节第二节变量及其类型变量及其类型36/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式) 整型(包括int、short、long)和实型(包括float、double)数据可以混合运算。而字符型数据可以与整型数据通用,因此,整型、实型、字符型数据间可以混合运算。 如: 10 + a + 1.5 8765.1234 * b 在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算。其转换规则如图所示: 横向向左的箭头表示必定的转换。如:字符型数据必定先转换成整型数据,short转换成int,float转

60、换成double。纵向箭头表示当运算对象为不同类型时转换的方向。如:int型与double型运算时,先将int型数据转换成double型数据,然后两个double型数据间进行运算,结果为double型。注意注意箭头方向只表示数据类型级别的高低,由低向高转换。不表示中间类型一定要转换。unsignedlongintdoublechar,shortfloat高高低低课件制作:刘达明课件制作:刘达明023-66834110第第2章章C语言的数据类型、运算符及其表达式语言的数据类型、运算符及其表达式-习题习题237/71C语言程序设计语言程序设计 龙昭华主编习习题题(二二)*复习本章已讲内容,预习本章

61、剩余内容。复习本章已讲内容,预习本章剩余内容。2.1请将以下请将以下3个整数分别赋给不同类型的变量,请画出数据在内存中的存储个整数分别赋给不同类型的变量,请画出数据在内存中的存储形式。形式。变量的类型变量的类型25-232769int型型(16位位)long型型(32位位)short型型(16位位)signedchar型型(8位位)unsignedint型型unsignedlong型型unsignedshort型型unsignedchar型型课件制作:刘达明课件制作:刘达明023-66834110第三节第三节运算符和表达式运算符和表达式38/71一、一、运算符简介和表达式概念运算符简介和表达式

62、概念(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)1、运算符简介、运算符简介运算符运算符是一种向编译程序说明一个特定的数学或逻辑运算的符号。C语言的运算符范围很宽,它把除了控制语句控制语句和输入输出输入输出外的几乎所有的基本操作都作为运算符处理。 算术运算符算术运算符: +、-、*、/、%、+、- 关系运算符关系运算符: 、=、=、=、!= 逻辑运算符逻辑运算符: !、&、| 位运算符位运算符: 、|、&、 赋值运算符赋值运算符: =及其双目运算符的扩展运算符+=、-=等 条件运算符条件运算符: ?、: 逗号运算符逗号运算符: , 指针运算符指针运算符

63、: *、& 求字节数运算符求字节数运算符: sizeof 强制类型转换运算符强制类型转换运算符: (类型) 分量运算符分量运算符: .、- 下标运算符下标运算符: 其他:如函数调用运算符函数调用运算符圆括号()注意:注意:所有运算符都有两个重要的特性:优先级优先级和结合性结合性。课件制作:刘达明课件制作:刘达明023-66834110、表达式的概念、表达式的概念第三节第三节运算符和表达式运算符和表达式39/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)表达式表达式是由运算符运算符和运算数运算数构成的,运算数可以是常量或变量。在C语言中,大部分表达式

64、的写法都是遵循代数符号法则的,对初学者,容易理解。然而C语言中的表达式与代数符号法则仍然有不同之处。例如:运算符的结合性;算术表达式、关系表达式、逻辑表达式、条件表达式、逗号表达式、赋值表达式也能构成语言的基本表达式。 C表达式与代数表达式的写法有很大差别。如:C语言的表达式非常丰富,有人称C语言为表达式语言。数学代数表达式数学代数表达式C表达式表达式y=a*x*x+b*x+c5!1*2*3*4*5sqrt(m)=x*x*x课件制作:刘达明课件制作:刘达明023-66834110二、二、 算术运算符和算术表达式算术运算符和算术表达式第三节第三节运算符和表达式运算符和表达式40/71(第二章(第

65、二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)优先级优先级运算符运算符含义含义要求运算对象个数要求运算对象个数结合方向结合方向例子例子(i=3)结果结果2+自增,加自增,加11(单目运算符单目运算符)自右向左自右向左+i4-自减,减自减,减1-i2-负号负号-i-3(类类型型)类类型型转转换换(float)i3.003*乘乘2(双目运算符双目运算符)自左向右自左向右3*26/除除8/32%求余求余(模运算符模运算符)3%534+加加2(双目运算符双目运算符)自左向右自左向右3+6.09.0-减减9-18、算术运算符、算术运算符(基本、自增自减、类型转换基本、自增自

66、减、类型转换)注意注意:求余运算符两侧均应为整型数据,如7%4的值为3。 两个整数相除结果为整数,并舍去小数部分,如5/3结果为1。但如果除数或被除数中有一个为负数,则舍入的方向不固定,多数C系统规定“向0靠拢”。课件制作:刘达明课件制作:刘达明023-66834110、算术表达式和运算符的优先级与结合性、算术表达式和运算符的优先级与结合性第三节第三节运算符和表达式运算符和表达式41/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)用运算符和括号运算符和括号将运算对象运算对象(也称操作数)连起来的、符合C语法规则的式子,称为C算术表达式算术表达式。运

67、算对象包括:常量、变量、函数等。如:a*b/c-1.5+a就是一个合法的C算术表达式。C规定了运算符的优先级和结合性。在表达式求值时,先按运算符的优先级别高低顺序执行,优先级别的数字优先级别的数字越小,其级别越高,越要先执行越小,其级别越高,越要先执行。如果在一个运算对象的两侧的运算符的优一个运算对象的两侧的运算符的优先级别相同,则按先级别相同,则按C规定的各种运算符的结合方向规定的各种运算符的结合方向(结合性结合性)处理处理。关于“结合性”的概念在其他一些高级语言中是没有的,是C的特点之一,必须弄清楚。如果一个运算符的两侧的数据类型不同,则会按前面讲过的先自动进行类自动进行类型转换型转换,使

68、二者具有相同的数据类型,然后再进行运算。如:表达式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)。课件制作:刘达明课件制作:刘达明023-668341103 3、强制转换运算符、强制转换运算符第三节第三节运算符和表达式运算符和表达式42/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)可以利用强制转换运算符将一个表达式转换成所需的数据类型。强制转换运算符的一般形式为:(

69、类型名类型名)(表达式表达式)注意:类型名和表达式都应该用括号括起来。如:(double)a/*将变量a转换成double类型*/(int)(x+y)/*将表达式x+y转换成int类型*/(float)(x/2)/*将表达式x/2转换成float类型*/(float)(5%3)/*将表达式5%3转换成float类型*/在强制类型转换时,得到的是一个所需类型的中间变量,原来变量的类型仍未发生变化。如:floatx;(int)x;。强制类型转换用途之一是整型量运算时,其结果需保留小数时可对其中一个强制为float或double型,在运算前系统会自动将两个操作数转换为flaot或double型,运算

70、结果也是float或double型。如:inti=10,j=4,k;floatx=3.6,f;k=(int)x;f=i/j;则有:x=3.600000f=2.000000k=3课件制作:刘达明课件制作:刘达明023-668341104 4、自增自减运算符、自增自减运算符第三节第三节运算符和表达式运算符和表达式43/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式) 自增自减运算符自增自减运算符的作用是使变量的值增使变量的值增1 1或减或减1 1。自增+和自减-仅仅用于变量,而不能用于常量和表达式。 +i /*相当于i=i+1,但在使用i之前,先使i值加

71、1*/ i+ /*相当于i=i+1,但在使用i之后,再使i值加1*/ -i /*相当于i=i-1,但在使用i之前,先使i值减1*/ i- /*相当于i=i-1,但在使用i之后,再使i值减1*/ +和的结合方向结合方向是自右向左的是自右向左的,即对于-i+,相当于-(i+)。例如: mainmain()() int int x x,y;y; x=10; y=+x;x=10; y=+x; printfprintf(“%d(“%d,%dn”%dn”,x x,y);y); 运算结果为: 11,11 自增自减运算符常用于循环语句中,使循环变量自动加(减)1。课件制作:刘达明课件制作:刘达明023-668

72、341105、表达式的求值顺序、表达式的求值顺序第三节第三节运算符和表达式运算符和表达式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;

73、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语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明023-668341106 6、

74、指针变量的算术运算、指针变量的算术运算第三节第三节运算符和表达式运算符和表达式45/71 指针变量是一个变量,因此可以进行某些运算。但指针的本质是一个地址,其运算具有一些特别的性质,不能用普通变量的规则运算来作为指针运算的方式。 指指针变量加变量加( (减减) )一个整数的一个整数的算算术运算运算 这里只能进行加加、减减、自增、自减、自增、自减(+、-、+、-)运算。 C C语言规定语言规定,一个指针变量加(减)一个整数并不是简单地将指针变量的原值加(减)一个整数,而是将该指针变量的原值该指针变量的原值(是一个地址)和它指向的变量所占它指向的变量所占用的内存单元字节数用的内存单元字节数相加加(

75、 (减减) )。 +、+代表指针前移,-、-代表指针后移。指针变量每加(或减)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=&b; 当执行p=p+2;时,p就指向变量d,相当于p=&d;而执行p-; (或p=p-1;)时,p就指向变量a,相当于p=&a。(第二章(第二章 C语言的数据类型、运算符及

76、其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明023-66834110三、三、 赋值运算符和赋值表达式赋值运算符和赋值表达式第三节第三节运算符和表达式运算符和表达式46/71 两个指两个指针变量之量之间的的算术算术运算运算 两个指针变量之间只有减法两个指针变量之间只有减法(-)(-)运算运算。只有指向同一数组的两个指针变量之间才能进行这种运算,否则两个指针变量之间的运算毫无意义(但在程序中不会报错)。指向同一数组的两个指针变量之差,是两个指针之间的元素个数。结果结果为个数为个数。1、赋值运算符、赋值运算符赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变

77、量,也可以将一个表达式赋给一个变量。=如:inti;i=3;floatk;k=7.8;指针变量的赋值指针变量的赋值:inti,*p1,*p2;p1=&i; 指针标量可以指向一个空值:指针标量可以指向一个空值:p2=NULL;或p2=0;表明p2是空指针。2、类型转换、类型转换如果赋值运算符两侧的类型不一致,但都是数字型或字符型时,在赋值时要进行类型转换。类型转换可以自动实现和强制转换两种方式。如:inti;i=2.9;floata;a=8;floatb;b=(float)9;(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明

78、023-668341103、复合运算符、复合运算符第三节第三节运算符和表达式运算符和表达式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=2;相当于a=a=如:a=c;相当于a=ac;&=如:a&=16;相当于a=a&16;=如:a=127;相当于a=a127

79、;|=如:a|=32;相当于a=a|32;赋值运算符是双目运算符,处于同一优先级,优先级别为14,其结合方向为自右至左。课件制作:刘达明课件制作:刘达明023-668341104 4、赋值表达式、赋值表达式第三节第三节运算符和表达式运算符和表达式48/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。其一般形式为:如:a=8;,对赋值表达式求解的过程是:将赋值符右侧的“表达式”的值赋给左侧的变量。除了以上格式外,还有如下形式的“多重赋值表达式”:变量变量1=变量变量2=变量变量3=。=

80、变量变量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=

81、a+(-132)=-264。将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中。课件制作:刘达明课件制作:刘达明023-66834110四、四、 逗号运算符和逗号表达式逗号运算符和逗号表达式第三节第三节运算符和表达式运算符和表达式49/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)在C语言中,逗号“,”有两种用法:一种是作为分隔符分隔符使用,另一种是作为运算符运算符使用。逗号作为分隔符逗号作为分隔符使用时有:变量声明语句,各变量间使用逗号分隔:inti,j,k;;在函数调

82、用时,函数参数之间使用逗号分隔:scanf(%d,%d”,&a,&b);。逗号作为运算符逗号作为运算符使用时,逗号“,”运算符用于将多个表达式串在一起成为一个逗号表达式,逗号表达式的形式如下:表达式表达式1,表达式,表达式2,表达式,表达式n逗号表达式按逗号间的顺序从左至右左至右依次执行,“,”运算符的左边的值总不返回,整个逗号表达式的值为最后一个逗号右边表达式的值整个逗号表达式的值为最后一个逗号右边表达式的值。值的注意,逗号运算符的优先级最低优先级最低。其实逗号表达式无非是把若干个表达式“串联”起来。在许多情况下,使用其实逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到和使用

83、整个逗号表达式的值,逗号表达式最常用于循环语句逗号表达式最常用于循环语句(for语句语句)中中。如:intx=50,y,z;y=(x=x-5,x/5);z=5+3,4+2;其结果为:x的值为:45,y的值为:9,z的值为:8。课件制作:刘达明课件制作:刘达明023-66834110五、五、 关系关系运算符和运算符和关系关系表达式表达式第三节第三节运算符和表达式运算符和表达式50/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)1、关系运算符、关系运算符关系运算符关系运算符是比较两个操作数大小的符号比较两个操作数大小的符号。关系运算实际上是比较运算比较

84、运算。将两个值进行比较,判断其比较的结果是否符合给定的条件。如果满足,关系表达式的值即为“真”,如果不满足,关系表达式的值即为“假”。在C中true可以是不为0的任何值,而false则为0。C语言提供6种关系运算符:优先级优先级运算符运算符含义含义要求运算对象个数要求运算对象个数结合方向结合方向例子例子结果结果6小于小于2(双目运算符双目运算符)自左向右自左向右9大于大于9100=小于等于小于等于9=大于等于大于等于9=1007=等于等于2(双目运算符双目运算符)自左向右自左向右9=100!=不等于不等于9!=101使用关系运算符表达式时,若表达式为真true,则返回1,否则表达式为假fals

85、e,则返回0。课件制作:刘达明课件制作:刘达明023-668341102 2、关系表达式关系表达式第三节第三节运算符和表达式运算符和表达式51/71 用关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的有意义的式子称为关系表达式关系表达式。关系表达式的形式如下: 如:10(2+10),a+bb+c,ab)=(bc),x=y,a+b!=c等。再如:inta=3,b=2,c=1;则ac则返回1。 两个指两个指针变量之量之间的的比较比较( (关系关系运算运算) ): 两个指针之间关系运算是比较两个指针所指向的地址关系,其运算符有:=、!=、=。比较运

86、算结果为:真真(1)(1)或假或假(0)(0)。 如: p1=&a1;p2=&a4; 则:p1=p2为假(0),p1!=p2为真(1),p1p2为假。当p1=p2p1=p2时,表示p1、p2指向同一数组元素地址。当p1p2p1p2时表示p1比p2的地址值大,在高地址位置。当p1p2p1p2时,表示p1比p2的地址值小,处于低地址位置。 注意:注意:只有两个指针指向同一数组的元素时,进行比较才有意义,这时指向前面的元素的指针变量“小于”指向后面的元素的指针变量。(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明023-6683

87、4110六、六、 逻辑逻辑运算符和运算符和逻辑逻辑表达式表达式第三节第三节运算符和表达式运算符和表达式52/711、逻辑运算符、逻辑运算符逻辑运算符是指用形式逻辑原则来建立数值间关系的符号。C语言提供3种逻辑运算符:优先级优先级运算符运算符含义含义要求运算对象个数要求运算对象个数结合方向结合方向例子例子结果结果2!逻辑非逻辑非1(单目运算符单目运算符)自右向左自右向左!10011&逻辑与逻辑与2(双目运算符双目运算符)自左向右自左向右9&10112|逻辑或逻辑或2(双目运算符双目运算符)自左向右自左向右0|101ab!a!ba&ba|b真真(非非0)真真(非非0)假假(0)假假(0)真真(1)

88、真真(1)真真(非非0)假假(0)假假(0)真真(1)假假(0)真真(1)假假(0)真真(非非0)真真(1)假假(0)假假(0)真真(1)假假(0)假假(0)真真(1)真真(1)假假(0)假假(0)在C中true可以是不为0的任何值(如整型、实型、字符型、指针型等数据),而false则为0。逻辑运算的真值表为:(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明023-668341102 2、逻辑、逻辑表达式表达式第三节第三节运算符和表达式运算符和表达式53/71用逻辑运算符逻辑运算符将关系表达式关系表达式或逻辑量逻辑量连接起

89、来的式子称为逻辑表达式逻辑表达式。逻辑表达式的值是一个逻辑值,即“真”或“假”。C语言编译系统在给出逻辑运算结果时,以数字1表示“真”,以数字0表示“假”。但在判断一个量是否为“真”时,以非以非0表示表示“真真”,以,以0表示表示“假假”。abc非非0(真真)非非0(真真)非非0(真真)0(假假)0(假假)0(假假)1(真真)0(假假)a&b&c执行过程执行过程abc非非0(真真)非非0(真真)非非0(真真)0(假假)0(假假)0(假假)1(真真)0(假假)a|b|c执行过程执行过程注意注意:在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行。例如:a&b&c和a|b|c两个逻辑表达式的执行

90、过程如右图所示。逻辑运算符是可以转换。!(a|b)可写成!a&!b,而!(a&b)可写成!a|!b。闰年条件逻辑表达式闰年条件逻辑表达式: !(y%4)&y%100| !(y%100)&!(y%400)(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)课件制作:刘达明课件制作:刘达明023-66834110七、七、 取地址运算符和指针运算符取地址运算符和指针运算符第三节第三节运算符和表达式运算符和表达式54/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式) C语言提供单目运算符和*。使用它们可以方便地实现有关地址

91、地址和指针指针方面内容的运算。 & &是取地址运算符是取地址运算符。它的作用是,取得变量所占用的存储单元的首地址。在利用指针变量进行间接访问之前,都必须使用该运算符,将某变量的地址赋给相应的指针变量。 * *是间接访问运算符是间接访问运算符。它的作用是,通过指针变量间接访问它所指向的变量(存数据或取数据)。 如:&a是变量a的地址,*p为指针p所指向的存储单元的内容。 单目运算符*是&的逆运算。& &的操作数数变量的操作数数变量,* *的操作数是地址的操作数是地址。例如,如果pc是指向字符变量c的指针,则*(&c)和*pc表示同一字符变量c。因而赋值语句:*(&c)=a; c=a;*pc=a;

92、是等价的,都是将a存入变量c中。例例2.9:main()inti=10,j,*m;m=&i;/*将变量i的地址赋给m*/j=*m;/*地址m所指的单元的值赋给j*/*结果为:结果为:i=10,j=10*/课件制作:刘达明课件制作:刘达明023-66834110注意:注意:第三节第三节运算符和表达式运算符和表达式55/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式) & &运算符只能作用于变量运算符只能作用于变量,包括基本类型变量和数组变量的元素,结构体类型或结构体的成员,不能作用于数组名不能作用于数组名、常量常量、寄存器变量、表达式等寄存器变量、表达

93、式等。 使用运算符运算符* *时,要求指针已被正确初始化指针已被正确初始化或已确认它是指向了某一确定内存单元的指针变量。否则,地址未知的存储单元的操作是非常危险的,将有可能导致严重的运行错误或意外地修改内存中的重要数据。 &和和* *优先级别相同优先级别相同,都是第2级,其结合方向是“自右向左自右向左”。 如:int *p,i;p=&i;那么&*p;的运算顺序是:先算*p,即是变量i,再执行&运算。因此&*p和&i是相同的,都是变量i的地址。再如:int *p1,a;p1=&a那么*&a;的运算顺序是:先进行&a的运算得到a的地址,再进行*运算。即&a所指向的的变量,*&a和*p1的作用是一样

94、的都等价于变量a。也就是说:&*p相当于&(*p),*&a相当于*(&a)。&后面跟变量,*后面跟指针变量。&运算结果是地址,*运算结果是变量的值。 int i,*p;p=&i;那么,(*(*p)+p)+相当于i+。若计算* *p+p+;由于+和*同为第2级,其结合方向是“自右向左”,因此*p+相当于*(p+),*还是作用于p的原值,仍是i的值。但运行后,指针p加1,这时p不再指向变量i了。课件制作:刘达明课件制作:刘达明023-66834110八、八、 类型长度运算符类型长度运算符第三节第三节运算符和表达式运算符和表达式56/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数

95、据类型、运算符及其表达式)在程序设计过程中,有时需要了解一个变量或某种类型的变量在内存所占的字节数,sizeof运算符就是用于这一目的。sizeof运算符是一个单目运算符, 它返回变量或类型的字节长度。sizeof运算符有两种用法: 一般采用: sizeof( (运算对象运算对象) ) 或其它用法 sizeof运算对象运算对象其中运算对象可以是数据类型名、变量名、常数名等。变量、常量的大小实际上是它所属类型的大小。includemain()inti=162;floaty;printf(sizeof(+i)=%d,i=%dn,sizeof(+i),i);/*2,162*/printf(sizeo

96、f(China)=%dn,sizeof(China);/*6*/printf(sizeof(int)=%dn,sizeof(int);/*2*/printf(sizeof(1.1)=%dn,sizeof(1.1);/*8*/printf(sizeof(y=2*i+6.0)=%dn,sizeof(y=2*i+6.0);/*4*/*sizeof只是运算符,不是函数,实际上没有计算y=2*i+6.0*/例例2.10:课件制作:刘达明课件制作:刘达明023-66834110九、九、 条件运算符条件运算符第三节第三节运算符和表达式运算符和表达式57/71(第二章(第二章 C语言的数据类型、运算符及其表达

97、式)语言的数据类型、运算符及其表达式)条件运算符要求有三个操作数才能运算,它是C语言中唯一的一个三目运算符。也称为三目运算符三目运算符,由?和和:组成。条件运算符的一般形式为:表达式表达式1?表达式表达式2:表达式表达式3条件运算符的运算规则如图所示。其优先级在第13级上,结合方向为“自右向左”。表达式表达式1条件表达式取条件表达式取表达式表达式2的值的值条件表达式取条件表达式取表达式表达式3的值的值真真(非非0)假假(0)例如:max=(ab)?a:b;,min=(ab?a:b;表达式:ab?a:cd?c:d;由“自右向左”可知,它相当于:ab?a:(cd?c:d);条件表达式中,表达式1的

98、类型可以与表达式2和表达式3的类型不同。当表达式2与表达式3的类型不同时,条件表达式的值的类型为二者中较高的类型。如:xy?1:1.5;条件表达式的值为1.0或1.5。课件制作:刘达明课件制作:刘达明023-66834110第第2章章C语言的数据类型、运算符及其表达式语言的数据类型、运算符及其表达式-习题习题358/71C语言程序设计语言程序设计 龙昭华主编习习题题(三三)*复习本章已讲内容,预习本章剩余内容和第三章内容。复习本章已讲内容,预习本章剩余内容和第三章内容。2.2教材教材P38的习题的习题2.4中的全部小题,即中的全部小题,即2.4中的中的、。课件制作:刘达明课件制作:刘达明023

99、-66834110十、十、 位运算符位运算符第三节第三节运算符和表达式运算符和表达式59/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)C语言和其他高级语言不同,完全支持位运算。C C语言语言可用来代替代替汇编语言汇编语言完成大部分编程工作,位运算便是此目的的体现之一,特别是在计算机用于检测检测和控制领域控制领域时需要使用位运算。 位运算位运算是对字节字节或字中字中的实际二进制位二进制位进行检测检测、设置设置或移位移位。这些字节或字必须必须是charchar型型或intint型型数据和它们的变体。位运算符不能用于位运算符不能用于float,doub

100、le,void或其它更复杂的数据类型。优先级优先级运算符运算符含义含义要求运算对象个数要求运算对象个数结合方向结合方向例子例子结果结果2按位取反按位取反1(单目运算符单目运算符)自右向左自右向左3-45左移左移2(双目运算符双目运算符)自左向右自左向右5右移右移5218&按位与按位与2(双目运算符双目运算符)自左向右自左向右3&519按位异或按位异或2(双目运算符双目运算符)自左向右自左向右35610|按位或按位或2(双目运算符双目运算符)自左向右自左向右3|57课件制作:刘达明课件制作:刘达明023-668341101 1、“按按位与位与”运算符运算符&(与与AND)第三节第三节运算符和表达

101、式运算符和表达式60/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)参加运算的两个数据,按二进制进行“与”运算。如果两个相应的二进位都为1,则该位的结果值为1,否则为0。即:0&0=0,0&1=0,1&0=0,1&1=1。如:2&5=0:2=00000000000000103&5=1:3=0000000000000011(&)5=0000000000000101(&)5=000000000000010100000000000000000000000000000001-3&-5=-7:-3=11111111111111013&-5=3:3=00000

102、00000000011(&)-5=1111111111111011(&)-5=111111111111101111111111111110010000000000000011“按位与”运算的一些特殊用途:清零清零。将整个数如x清零只需要写成x=x&0即可。如果使数据的某一位或几位清零,只需要找到一个数,满足需要清零的相应位的位置为0,而其余位置的位为1即可。如需将数a=11000001的最高位清零,只需要执行a=a&127即可。再如00111111的第三位清零。a&127:a=11000001 00111111(&)127=01111111(&)111110111100000100111011

103、课件制作:刘达明课件制作:刘达明023-66834110 取一个数中某些位取一个数中某些位第三节第三节运算符和表达式运算符和表达式61/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)如有一个整数a(16位),想要其中的低字节,则取另外一个数,使其低字节全为1,高字节全为0即可,这个数为0377。如果想取2个字节的高字节,则取另外一个数,使其高字节全为1,低字节全为0即可,这个数为0177400。如:a=0010110010101100:a&0377:a=0010110010101100a&0177400:a=0010110010101100(&)0

104、377=0000000011111111(&)0177400=111111110000000000000000101011000010110000000000 想要哪一位保留下来想要哪一位保留下来,就与一个数进行&运算,此数在该位取1,其余位取0。如有一数01010100,想要把其中左面开始的第3、4、5、7、8位保留下来,可用下式运算:84&59=16:84=01010100(&)59=0011101116=00010000课件制作:刘达明课件制作:刘达明023-668341102 2、“按按位或位或”运算符运算符|(或或OR)第三节第三节运算符和表达式运算符和表达式62/71(第二章(第二

105、章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)参加运算的两个数据,按二进制进行“或”运算。如果两个相应的二进位只要有一个为1,则该位的结果值为1,否则为0。即:0|0=0,0|1=1,1|0=1,1|1=1。按位或运算按位或运算常用来指定一个数据的某些位为指定一个数据的某些位为1。如:a是一个16位的数,则a|0377将a的低8位全置为1,高8位不变。再如:将0011000的低4位置为1,只需与017或运算即可。a|0377:a=11000001 00000010060|017:060=00110000(|)0377=0000000011111111(|)017=0

106、01111111100000111111111001111113、“按位异或按位异或”运算符运算符(异或异或XOR)它的规则是若参加运算的两个二进位同号两个二进位同号,则结果为结果为0(假);异号则为异号则为1(真)。“异或”的意思是:判断两个相应的位值是否为判断两个相应的位值是否为“异异”,为“异”(值不同)就取真(1),否则不为“异”(值相同)就为假(0)。即:00=0,01=1,10=1,11=0。如:5742=19:57=001110010000000010101111()42=00101010()000000001010111119=000100110000000000000000课

107、件制作:刘达明课件制作:刘达明023-66834110“按按位异或位异或”的主要应用的主要应用第三节第三节运算符和表达式运算符和表达式63/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)特定位反转特定位反转假设有01111010,想使其低4位反转,即1变0,0变1。只需要该数与另一数(需要反转位的数字全为1,其余为0即可)进行运算。低4位反转:01111010高4位反转:01111010()00001111()111100000111010110001010与与0相相,保留原值,保留原值如果需要将某些位保留原值,只需将这些位与0异或即可。如:012

108、00=012:00001010()0000000000001010课件制作:刘达明课件制作:刘达明023-66834110整个清零,只需与本身异或即可整个清零,只需与本身异或即可第三节第三节运算符和表达式运算符和表达式64/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)即xx=0。如:x=1010111010101110()1010111000000000交换两个值,不用临时变量交换两个值,不用临时变量假设有a=3,b=4,想将a和b的值互换,可以用下面的赋值语句实现:a=ab;(结果a是一个中间值)b=ba;(结果b是原a的值)a=ab;(结果a

109、是原b的值)即:a=011(3) a=111(7) b=011(3)()b=100(4)()b=100(4)()a=111(7)a=111(7)b=011(3)a=100(4)这个计算等效于以下两步:第一:b=ba=b(ab)=bab=abb=a0=a第二:a=ab=(ab)(ba)=(ab)(b(ab)=abbab=aabbb=00b=b课件制作:刘达明课件制作:刘达明023-668341104 4、“按按位取反位取反”运算符运算符(反反NOT)NOT)第三节第三节运算符和表达式运算符和表达式65/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)是

110、一个单目运算,用来对一个二进制数按位求反,即将即将1变变0,0变变1。如:025求反:025=0177752:025=0000000000010101025=1111111111101010(0177752)若想将一个16位的整数a的最低一位变为0,可用:a=a&0177776。但如果想将一个32位的整数a的最低一位变为0,就必须用:a=a&037777777776。即:若a=00111101,有:a=0000000000111101a=00000000000000000000000000111101(&)0177776=1111111111111110(&)037777777776=1111

111、1111111111111111111111111110000000000011110000000000000000000000000000111100这样改动就导致了可移植性太差。可以改用:a=a&1,它对单字节、双字节、还是4字节存放一个整数都适用,不必修改程序。1的二进制为00000001,而1为11111110。即在32位中,1就是037777777776。在16位中,1就是0177776。注意:1不等于-1。如a=00111101,将其最低位变为0,可用:a=a&1课件制作:刘达明课件制作:刘达明023-668341105 5、“左移左移”运算符运算符第三节第三节运算符和表达式运算符

112、和表达式66/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)使变量的每一位向左移动,移出的最高位将丢失(溢出),而右端补入0。 左移的表达式形式为:变量名变量名移动的位数移动的位数对于无符号整数,并且在不溢出的情况下,左移一位相当于乘2,左移n位相当于乘以2 2n n。如:a=14;即00001110,a=a2;这时a为00111000,即56。a的值的值a的二进制形式的二进制形式a1a的值的值a第三节第三节运算符和表达式运算符和表达式67/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式) 使变量中的每一

113、位向右移动,移出的最低位将丢失。 如果该变量为无符号数无符号数,则高端位补高端位补0 0,右移后为正数右移后为正数。 如果该变量为有符号的正数有符号的正数时,则高端补高端补0 0。 如果该变量为有符号的负数有符号的负数时,即原最高位为1,右移一位后,高端位补高端位补0 0或或1 1要取决于的计算机系统:当高端补高端补0 0时,称为“逻辑右移逻辑右移”;当高端补高端补1 1时,称“算术右移算术右移”。对于Tuobo C是采用算术右移,即负数右移后高端移入1。右移表达式的形式为: 变量名变量名移动的位数移动的位数 如:202=5,-202=-5。再如: a: 1001011111101101 a1

114、: 0100101111110110 (逻辑右移) a1: 1100101111110110 (算术右移) 又如:a=017,a2=3。即: a为:00001111,a2为:00000011 - 11 (原来的后两位11被舍去)右移一位相当于除2取整,右移n位相当于除以2 2n n取整。课件制作:刘达明课件制作:刘达明023-668341107 7、位、位运算符的其他说明运算符的其他说明第三节第三节运算符和表达式运算符和表达式68/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式) 位运算符位运算符与赋值运算符赋值运算符可以组成复合赋值运算符复合赋值运

115、算符。如:&=、|=、=、=、=。例如:a&=b,相当于a=a&b。a=2,相当于a=a4 实现。 设置一个低4位全为1,其余全为0的数。 用:(04)&(04)即可。 程序如下:1587430(a)15430(b)0:00000000000000000:111111111111111104:1111111111110000(04):0000000000001111课件制作:刘达明课件制作:刘达明023-66834110例例 2.11 2.11 程序程序第三节第三节运算符和表达式运算符和表达式69/71(第二章(第二章 C语言的数据类型、运算符及其表达式)语言的数据类型、运算符及其表达式)#i

116、nclude main()unsigneda,b,c,d;scanf(“%o”,&a);/*输入的a为八进制*/b=a4;c=(0(指指针针型型结结构构成成员员)自自左左向向右右最最高高2!(逻辑非逻辑非)(位取反位取反)-(负号负号)+(加加1)-(减减1)&(变量地址变量地址)自右向左自右向左1(类型类型)*(指针所指内容指针所指内容)sizeof(长度计算长度计算)3*(乘乘)/(除除)%(取取模模)自自左左向右向右24+(加加)-(减减)自左向右自左向右25(位位右右移移)自自左左向右向右26(小小于于)(大大于于)=(大大于于等等于于)自自左左向向右右27=(等等于于)!=(不不等等

117、于于)自自左左向向右右28&(位与位与)自左向右自左向右29(位异或位异或)自左向右自左向右210|(位或位或)自左向右自左向右211&(逻辑与逻辑与)自左向右自左向右212|(逻辑或逻辑或)自左向右自左向右213?:(?表达式表达式)自右向左自右向左314=+=-=*=/=%=.单目运算符单目运算符关系运算符关系运算符逻逻辑辑运运算算符符(不不包包括括!)条件运算符条件运算符赋值运算符赋值运算符逗号运算符逗号运算符课件制作:刘达明课件制作:刘达明023-66834110第第2章章C语言的数据类型、运算符及其表达式语言的数据类型、运算符及其表达式-习题习题471/71C语言程序设计语言程序设计 龙昭华主编习习题题(四四)*复习本章已讲内容,预习第三章内容。复习本章已讲内容,预习第三章内容。2.3教材教材P3738的习题的习题2.1选择题、选择题、2.2填空题、填空题、2.3判断题中的全部小题。判断题中的全部小题。课件制作:刘达明课件制作:刘达明023-66834110

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号