《C语言基本语法元素.ppt》由会员分享,可在线阅读,更多相关《C语言基本语法元素.ppt(118页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言程序设计教程语言程序设计教程第2章:C 语言基本语法元素(3课时)提纲提纲l计算机内数的表示l数据类型l量与表达式l语 句l本章小结程序和数据程序和数据l通常程序要对数据进行操作处理:l处理的对象是数据l通过运算符和表达式进行操作l举例:l文字处理软件l数值计算软件l多媒体软件你如何描述数据?数据在程序如何描述?数据在程序如何描述?l为什么不使用:0和1组成的位串?l程序设计语言本身提供某种程度的抽象。lC语言中数据类型分为三大类:基本类型 构造类型 指针类型带来了什么好处?例如:例如:计算圆的面积,半径为 5 cm。程序如下:main()float r r,areaarea;r r=5
2、 5;areaarea=3.143.14*r r*r r;printf(%fn,areaarea);运算结果是输出圆的面积:运算结果是输出圆的面积:运算结果是输出圆的面积:运算结果是输出圆的面积:78.50000078.500000程序中用到的数据:程序中用到的数据:r、area、5、3.14对数据进行的运算:对数据进行的运算:*、=分析:分析:计算机操作处理时,要完成以下工作:l在内存中给半径 r 和运算结果 area 开辟存储空间,存放它们的值。应该留多大的地方来存放它们的值?l数据 5 和 3.14 与 r、area 不同,它们是在编写程序时就给出确定的值,在运算过程中不会改变。这样的数
3、计算机怎么处理?l对整数 5 和小数3.14,计算机存放时是否有区别?涉及数据类型涉及数据类型的基本知识的基本知识C语言的数据类型语言的数据类型 C数据类型数组类型数组类型结构体类型结构体类型共用体类型共用体类型枚举类型枚举类型整型整型整型整型 字符型字符型字符型字符型 实实实实型型型型(浮浮浮浮点点点点型型型型)空类型空类型空类型空类型单精度型单精度型单精度型单精度型 双精度型双精度型双精度型双精度型 基本类型基本类型基本类型基本类型指针类型指针类型构造类型构造类型本章讨论本章讨论本章讨论本章讨论基本类型数据基本类型数据基本类型数据基本类型数据计算机中数的表示计算机中数的表示 数值数据:表示
4、数量的多少。数值数据:表示数量的多少。数据数据 非数值数据:表示符号、标记。非数值数据:表示符号、标记。我我们们讨讨论论各各类类数数据据的的表表示示方方法法,就就是是讨讨论论它它们在计算机内的存储格式和编码规则。们在计算机内的存储格式和编码规则。如字母、汉字、标点符如字母、汉字、标点符号、运算符等。号、运算符等。R进制计数法进制计数法 数数制制 就就是是用用一一组组固固定定的的数数码码和和一一套套统统一的运算规则表示数值的方法。例如:一的运算规则表示数值的方法。例如:十十进进制制使使用用10个个数数码码(09),计计数数规规则则是是“逢十进一逢十进一”。二二进进制制使使用用2个个数数码码(0,
5、1),计计数数规规则则是是“逢二进一逢二进一”。八八进进制制使使用用8个个数数码码(07),计计数数规规则则是是“逢八进一逢八进一”。十十六六进进制制使使用用16个个数数码码(09,A,B,C,D,E,F),计计数数规规则则是是“逢逢十十六六进进一一”。基基数数(R)是是指指一一种种数数制制中中所所使使用用的的数数码码个数。个数。十进制使用十进制使用10个数码,基数个数码,基数R=10;二进制使用二进制使用2个数码,基数个数码,基数R=2;同同样样,八八进进制制的的基基数数R=8;十十六六进进制制的的基数基数R=16。由以上四种数制可以看出一个规律:由以上四种数制可以看出一个规律:各各种种数数
6、制制中中,最最小小的的数数码码都都是是0,最最大大的数码都比基数小的数码都比基数小1(R1)。1.有有人人说说:“2008不不可可能能是是八八进进制制数数”,这这种种说法对吗?说法对吗?对。对。因因为为八八进进制制数数中中没没有有数数码码8。2008可可能能是是十十进进制制数数,也也可可能能是是十十六六进进制制数。数。位位权权 在在一一个个数数中中,同同一一个个数数码码处处于于不不同位置所代表的值不同。同位置所代表的值不同。例例如如,十十进进制制数数111.8中中有有3个个1,它它们们分分别别表表示示100、10、1。111.8 可可以以写写成成如如下下形式:形式:111.8=1102+110
7、1+1100 +810-1 其其中中,以以基基数数10为为底底的的整整数数幂幂(如如102,101,100,10-1)称为各位的位权。称为各位的位权。上式等号右面的多项式称为上式等号右面的多项式称为按权展开式。按权展开式。同理,二进制数同理,二进制数1011 B可以按权展开:可以按权展开:1011 B=123 +022 +121+120 其其中中,以以基基数数2为为底底的的整整数数幂幂就就是是各各位位的的权:权:位:位:1 0 1 1 位权:位权:23 22 21 20 四种数制间的转换四种数制间的转换 1.二进制数与十进制数之间的转换二进制数与十进制数之间的转换 二进制数二进制数十进制数十进
8、制数 方法:按权展开求和。方法:按权展开求和。例例1.1101 B=D1101 B=123+122+021+120=8+4+0+1=1313 十进制十进制整数整数二进制整数二进制整数 方法:除方法:除2取余,余数倒序排列。取余,余数倒序排列。例例2.13=B2 132 6 12 1 12 3 0 0 11101 余数倒序排列商为商为0,除法停止,除法停止 十进制十进制小数小数二进制小数二进制小数 方法:乘方法:乘2取整,整数正序排列。取整,整数正序排列。例例3.0.125=B 0.125 20.2500 2 0.5000 2 1.0001小数部分为小数部分为0,乘法停止,乘法停止整数正序排列0
9、.001 例例4.0.43=B 0.43 2 0 0.86 2 1 1.72 (取走整数)0.72 2 1 1.44 (取走整数)0.44 2 0 0.88 0.430.0110 B 误差小于误差小于2-4 例例5.13.125=B 方法:方法:先把整数部分先把整数部分13转换成二进制整数转换成二进制整数1101;再把小数部分再把小数部分0.125转换成二进制小转换成二进制小数数0.001;把两部分写在一起:把两部分写在一起:1101.001B 2.二进制数二进制数 八进制数八进制数 先看先看 表表1-1。从表中可看出如下规律:。从表中可看出如下规律:二进制数二进制数八进制数八进制数 方方法法
10、:先先将将二二进进制制数数从从小小数数点点开开始始,向向左左或或向向右右每每3位位分分成成一一组组,再再将将每每一一组组写写成成1位八进制数。位八进制数。例例6.1011101.11 B=001 011 101.110 B =135.6 Q 3位二进制数对应位二进制数对应1位八进制数;位八进制数;4位二进制数对应位二进制数对应1位十六进制数。位十六进制数。八进制数八进制数二进制数二进制数 方方法法:将将每每1位位八八进进制制数数直直接接写写成成3位位二二进制数。进制数。例例7.237 Q=010 011 111 B =10011111 B 3.二进制数二进制数 十六进制数十六进制数 二进制数二
11、进制数十六进制数十六进制数 方方法法:将将二二进进制制数数从从小小数数点点开开始始,每每4位位分分成成一一组组,再再将将每每一一组组写写成成1位位十十六六进进制制数。数。例例8.1011100 B=0101 1100 B =5C H 十六进制数十六进制数二进制数二进制数 方法方法:将每:将每1位十六进制数直接写成位十六进制数直接写成4位二进制数。位二进制数。例例9.1C8 H=0001 1100 1000 B =111001000 B 注:十进制数注:十进制数 八进制数八进制数 十进制数十进制数 十六进制数十六进制数 方法与十进制数方法与十进制数 二进制数类似。二进制数类似。例例10.127
12、Q=D 127 Q=182+281+780 =64+16+7 =87 例例11.100=H 方法:除基取余。方法:除基取余。16)1 0 069 6416)6006余数倒序排列64 提提示示:当当数数值值较较大大时时(如如226),为为了了减减少少除除法法次次数数,以以减减少少出出错错机机会会,更更好好的方法是:的方法是:十进制数十进制数十六进制数十六进制数二进制数二进制数 2.与与18等值的二进制数是等值的二进制数是 。3.与与128对应的十六进制数对应的十六进制数 是是_。10 0 10 B8 0 H 数值数据有两种表示方法,例如:数值数据有两种表示方法,例如:后缀法后缀法 下标法下标法
13、1010 B (1010)2 6072 Q (6072)8 985 D 或或 985 (985)10 或或 985 9F0 H (9F0)16 0B407 H (B407)16 十六进制数以字母开头时,前面加0计算机中数据的编码方法计算机中数据的编码方法 数数值值数数据据包包括括整整数数和和实实数数。在在计计算算机机内内部都用二进制表示。部都用二进制表示。实实数数表表示示形形式式有有两两种种:小小数数和和指指数数。为为了便于理解,用十进制与二进制进行对比:了便于理解,用十进制与二进制进行对比:十进制十进制 二进制二进制 小数形式小数形式 1.5 1.1 B 指数形式指数形式 1.5*100 1
14、.1*200B 或或 0.15*101 0.11*201B 或或 0.015*102 0.011*210B规格化形式 因因为为在在指指数数形形式式中中,小小数数点点的的位位置置可可以以浮浮动动,所所以以实实数数又又称称浮浮点点数数。指指数数形形式式又又称称科学计数法,它由三部分组成:科学计数法,它由三部分组成:0.11*201B 指数指数(决定数的大小决定数的大小)底底(即基数即基数R)尾数尾数(决定数的精度决定数的精度)对对于于浮浮点点数数,因因为为底底2是是固固定定不不变变的的,可可以不存储它,只要存储尾数和指数即可。以不存储它,只要存储尾数和指数即可。指指数数形形式式有有多多种种,但但是
15、是,系系统统以以指指数数形形式输出实数时,均采用规格化形式,即尾数式输出实数时,均采用规格化形式,即尾数中整数部分为中整数部分为0,小数部分最高位不为,小数部分最高位不为0。在在计计算算机机中中,只只能能用用有有限限个个二二进进制制位位存存储储一一个个数数。在在这这有有限限个个二二进进制制位位(如如32位位)中中,尾尾数数和和指指数数各各占占多多少少位位,才才能能使使精精度度最最高高、数数的的表表示示范范围围最最大大呢呢?C语语言言采采用用IEEE(美美国国电电气气和和电电子子工工程程师师学学会会)格格式式:符符号号位位占占1位位,指指数数占占8位位,尾尾数数占占23位位。具体格式将在第具体格
16、式将在第9章介绍。章介绍。下面介绍整数的编码。下面介绍整数的编码。数据的数据的原码、反码和补码表示原码、反码和补码表示 我们以我们以8位二进制数为例,介绍整数编码位二进制数为例,介绍整数编码的概念和方法。用的概念和方法。用8个二进制位表示个二进制位表示1个整数个整数时,各位的序号是:时,各位的序号是:7 6 5 4 3 2 1 0 1.原码表示法原码表示法 最最高高位位为为符符号号位位,其其余余各各位位表表示示数数的的绝绝对值。对值。符号位符号位:0 表示正表示正,1 表示负表示负00000011 例如:例如:3的原码:的原码:0 0 0 0 0 0 1 1 3的原码:的原码:1 0 0 0
17、0 0 1 1 表示范围:表示范围:1111111101111111 127127 即即(27 1)(27 1)原码的缺点:原码的缺点:零的表示不唯一:零的表示不唯一:0 000000000000000 1 100000000000000 运运算算时时,要要对对数数的的不不同同符符号号作作不不同同的处理,相当麻烦。的处理,相当麻烦。2.反码表示法反码表示法 正数的反码同原码。正数的反码同原码。负负数数的的反反码码:符符号号位位为为1,其其余余各各位位是是其原码的按位取反。其原码的按位取反。例如:例如:3的原码:的原码:1 0 0 0 0 0 1 1 3的反码:的反码:1 1 1 1 1 1 0
18、 0 表示范围:表示范围:10000000 01111111 即即 127 127 反反码码也也有有两两个个零零,使使用用也也不不方方便便。引引入入反码的目的是通过它来求补码。反码的目的是通过它来求补码。3.补码表示法补码表示法 正数的补码同原码。正数的补码同原码。负负数数的的补补码码:符符号号位位仍仍为为1,在在其其反反码码的末位加的末位加1便得到补码。便得到补码。例如:例如:3的原码:的原码:1 0 0 0 0 0 1 1 3的反码:的反码:1 1 1 1 1 1 0 0 3的补码:的补码:1 1 1 1 1 1 0 1 表示范围:表示范围:10000000 01111111 128 12
19、7 即即27 (271)补码的变化规律补码的变化规律(128127)*127 01111111 126 01111110 2 00000010 1 00000001 0 00000000 1 11111111 2 11111110 127 10000001 128 10000000 在在微微机机中中,数数据据存存储储和和运运算算使使用用补补码码。因为因为补码具有如下优点:补码具有如下优点:零的表示是唯一的:零的表示是唯一的:00000000 使使用用补补码码可可将将减减法法转转换换成成加加法法运运算算,并并且且符符号号位位与与数数值值位位一一样样参参与与运运算算,非非常常方方便。例如:便。例如
20、:21=2+(1),用补码加法运算:用补码加法运算:00000010 2 的补码的补码 +11111111 1 的补码的补码 100000001 和仍为补码,其值为和仍为补码,其值为1 1 自然丢失自然丢失4.请请写写出出10和和10的的8位位二二进制补码。进制补码。注意:负数的补码不表示真值,再对注意:负数的补码不表示真值,再对其求一次补码才是真值。其求一次补码才是真值。10的补码:的补码:00001010 10的原码:的原码:10001010 10的反码:的反码:11110101 10的补码:的补码:11110110 5.8位位二二进进制制补补码码能能够够表表示示的的数值范围是数值范围是
21、。超过此范围的数如何表示?超过此范围的数如何表示?128127用用16位或位或32位来表示更大的数位来表示更大的数ASCII码码字符的编码字符的编码 字字符符编编码码就就是是规规定定用用怎怎样样的的二二进进制制码码来来表表示示字字母母、数数字字及及各各种种符符号号,以以便便计计算算机机能能够识别、存储和处理它们。够识别、存储和处理它们。在在微微机机中中,字字符符编编码码采采用用ASCII(美美国国信信息息交交换换标标准准代代码码)。ASCII码码有有7位位和和8位位两两种种版版本本。7位位ASCII码码是是国国际际标标准准(见见教教材材P539附附录录A)。1个个字字符符的的ASCII码码虽虽
22、然然是是7位位,但但是是字字节节是基本存储单位,所以是基本存储单位,所以1个字符必须占个字符必须占1个字个字节,最高位置节,最高位置0。表表中中,ASCII码码为为031和和127总总共共33个个字字符符为为控控制制符符,如如回回车车符符CR、换换行行符符LF、删除符删除符DEL等,控制符主要用于数据传输。等,控制符主要用于数据传输。ASCII码码为为32126的的字字符符是是可可打打印印字字符符(其其中中SP表表示示空空格格),这这些些字字符符用用于于显显示示或或打打印输出。由印输出。由ASCII码表可以看出如下规律:码表可以看出如下规律:小小写写字字母母的的ASCII码码比比其其大大写写字
23、字母母的的ASCII码码大大32。例例如如,A的的ASCII码码为为65,a的的ASCII码为码为65+32=97。阿阿拉拉伯伯数数字字0的的ASCII码码为为48,1的的ASCII码为码为49,依次递增。依次递增。只只要要记记住住两两个个ASCII码码和和一一条条规规律律,便便能计算出所有字母和数字字符的能计算出所有字母和数字字符的ASCII码码:例例如如,d是是第第4个个英英文文字字母母,所所以以d的的ASCII码为:码为:65+41+32=100 6排排在在0后后面面第第6个个位位置置,所所以以6的的ASCII码为:码为:48+6=54 A65,048 小写字母小写字母ASCII码比其大
24、写字母码比其大写字母ASCII码大码大32 扩扩展展ASCII码码*采采用用8位位编编码码,最最高高位位是是1,从从1000000011111111(128255),可可表表示示127个个符符号号,如如希希腊腊字字母母、等等,数数学学符符号号、等等,拼拼音音字字母母、等等。等等。汉汉字字也也是是非非数数值值数数据据,其其编编码码方方法法比比较较复杂,请参考第复杂,请参考第5章。章。整型整型(int)字符型字符型(char)实型实型双精度型双精度型(double)无值类型无值类型(void)基本类型基本类型基本类型基本类型单精度型单精度型(float)基本数据类型基本数据类型C99又增加了三种类
25、型:又增加了三种类型:_Bool,_Complex,_Imaginary字符型数据字符型数据 l字符型数据char,分配 1 Byte l字符型数据是指字母、数字、各种符号等用ASCII值表示的字符l例如 a 是一个char类型数据,称作字符常量,存储:0 1 1 0 0 0 0 1整型数据整型数据 l基本整型数据 int l数据类型的尺寸:为了移植性考虑,标准并未指定,通常和程序执行环境的字长相同。lC语言规定了每种类型的最小范围。l整型数据均以二进制补码形式存储。l类型修饰符:lsigned(有符号)lunsigned(无符号)llong(长型)lshort(短型)实型数据实型数据 1实型
26、数据的类型 l单精度实型数据 float,分配4 Bytel双精度实型数据double,分配 8 Byte2实型数据的存储 单精度实型单精度实型单精度实型单精度实型指数部分指数部分指数部分指数部分小数部分小数部分小数部分小数部分 小数的符号位小数的符号位指数的符号位指数的符号位数据表示范围数据表示范围常量、变量与标准函数常量、变量与标准函数 l主要内容:l常量l变量l标准库函数常量常量 l在运行程序的过程中值保持不变的量1整型常量 l十进制:09l八进制:07,以 0开头l十六进制:09,AF/af,以 0 x或 0X 开头例如:例如:100 -8 0 +123100 -8 0 +123010
27、 024 0100 073010 024 0100 0730 x38 0 x10 0X10 0XFF 0 x0a0 x38 0 x10 0X10 0XFF 0 x0a整型常量整型常量l整型常量的类型:l根据值大小默认类型。l整型常量后面加l或L,则认为是long int型 例如:123L、0L、432l、0 x100l注意:注意:l l十六进制常量中可以使用大写字母十六进制常量中可以使用大写字母AF,也可以使用小写字母也可以使用小写字母af。l l八进制常量中不能出现数字八进制常量中不能出现数字 8 或或 9例如:例如:018、0921非法非法实型常量实型常量 l十进制形式 1.0 1.+12
28、.0 -12.0 0.0l指数形式 1e3 1.8e-3 -123E-6 -.1E-3等价于:等价于:等价于:等价于:1101103 3 1.810 1.810-3-3 -1231012310-6-6 -0.1100.110-3-3指数只能是整数,而尾数则可以是整数也可以指数只能是整数,而尾数则可以是整数也可以是小数是小数,无论指数或尾数均不能省略,无论指数或尾数均不能省略例如:例如:1e1e、E.5E.5、E-3E-3 非法非法实型常量的类型:默认为实型常量的类型:默认为doubledouble型,后面加型,后面加F F(或(或f f),),则强调表示该数是则强调表示该数是float类型类型
29、例如:例如:3.5f f、1e2F F 字符型常量字符型常量 l可视字符常量 l单引号括起来的单个可视字符例如:a、A、+、3、等 l转义字符常量l单引号括起来的 与可视字符组合,例如:0字符串结束标志n回车换行t跳到下一个输出位置双引号字符dddddd为1到3位八进制数所代表的字符xhhhh为1到2位十六进制数所代表的字符字符串常量字符串常量 l用双引号括起的一个字符序列l例如:ABC、123、a、nt nGood morningl字符串常量的长度:l所包含的字符个数 l字符串常量的存储方式:nG oodm orning0a0所占存储单元数:所占存储单元数:串长度串长度1例如:例如:字符串字
30、符串结束标记结束标记符号常量符号常量 l以标识符来代表的常量l事先编译预处理命令define定义l编译时先由系统替换为它所代表的常量,再进行编译例如:#define#define LENLEN 2.52.5main()main()float a,b;float a,b;a=2*3.14*a=2*3.14*LENLEN;b=3.14*b=3.14*LENLEN*LENLEN;printf(a=%f,b=%fn,a,b);printf(a=%f,b=%fn,a,b);定义符号常量定义符号常量定义符号常量定义符号常量使用符号常量使用符号常量使用符号常量使用符号常量编译前系统进行替换编译前系统进行替换
31、编译前系统进行替换编译前系统进行替换符号常量符号常量main()float a,b;a=2*3.14*2.5;b=3.14*2.5*2.5;printf(a=%f,b=%fn,a,b);define是编译预处理命令,必须以是编译预处理命令,必须以“#”开开头头替换为替换为替换为替换为变量变量 变量的有关概念l在程序运行过程中,其值改变的数据,称为变量,变量用标识符表示,称为变量名。l变量必须“先定义后使用”l系统为变量分配存储单元,存储变量的值。l编写程序时通过变量名来存、取变量值。a a510510变量值变量值变量值变量值为变量分配的为变量分配的为变量分配的为变量分配的存储单元存储单元存储单
32、元存储单元变量名变量名变量名变量名例如:例如:有有变量变量a a它的值是它的值是510510变量定义变量定义变量定义的一般格式:数据类型说明符 变量列表;例如:int i,j;long k,m;float x,y;char ch1,ch2;必须使用合法的标识符作变量名必须使用合法的标识符作变量名不能使用关键字为变量命名不能使用关键字为变量命名变量变量 在在程程序序运运行行过过程程中中,其其值值可可以以改改变变的的量称为变量。量称为变量。C语言规定:语言规定:变变量量名名、数数组组名名、函函数数名名、文文件件名名等等标标识识符符只只能能由由字字母母、数数字字和和下下划划线线组组成成,且第且第1个
33、字符必须是字母或下划线;个字符必须是字母或下划线;标识符标识符最大长度不要超过最大长度不要超过32个字符。个字符。例如,下面的变量名是合法的:例如,下面的变量名是合法的:sum,number_1,_add 而而$56,3a,a5是非法的变量名。是非法的变量名。注意:注意:变量名中的字母区分大小写。变量名中的字母区分大小写。如:如:sum 和和Sum 是两个不同的变量。是两个不同的变量。变变量量在在使使用用前前,必必须须先先定定义义,指指明明它它为为何种类型,然后才能在程序中使用它。如:何种类型,然后才能在程序中使用它。如:int n;n被定义为整型被定义为整型 在在程程序序中中,通通过过变变量
34、量名名找找到到内内存存单单元元的的地址,从中读取它的值。地址,从中读取它的值。为为了了增增加加程程序序的的可可读读性性,建建议议大大家家使使用用能能够够“见见名名知知意意”的的标标识识符符。例例如如,name、sum比比n、s的含义更明确,可读性更好。的含义更明确,可读性更好。值值变量名变量名 n存储单元存储单元变量的初始化:变量的初始化:允许在说明变量的时候对变量赋初值。例如:int a=5,b=10+2;double x=23.568,y;char ch1=a,ch2=66,ch3=142;表示定义变量并对变量存储单元赋值。错误的初始化:int a=3+b,b=5;float m=n=23
35、.16;标准库函数标准库函数l由C编译系统定义的一种函数,存放在系统函数库中,用户可以根据需要随时调用l常用函数如:printf、scanf、fabs、sqrt、sin、(常用数学函数参见教材 P30 表2.5)l函数调用形式:函数名(参数表)例如:putchar(a)sqrt(x)运算符和表达式运算符和表达式l主要内容:l算术运算符和算术表达式l赋值运算符和赋值表达式l关系运算符和关系表达式l逻辑运算符和逻辑表达式l位运算符和位运算表达式l条件运算符和条件表达式l逗号运算符和逗号表达式l其他运算符及其运算运算符的有关概念运算符的有关概念l作用:l对运算对象完成规定的操作运算l类型:l按运算对
36、象分:l单目、双目、三目l按功能分:l算术、赋值、关系、逻辑l条件、逗号、位、其他运算符的优先级和结合性运算符的优先级和结合性l优先级l指各种运算符号的运算优先顺序例如:算术运算优先于关系运算 算术运算中先*/后+-l l结合性结合性 指运算符号和运算对象的结合方向指运算符号和运算对象的结合方向指运算符号和运算对象的结合方向指运算符号和运算对象的结合方向 分为:从左向右分为:从左向右分为:从左向右分为:从左向右(左结合左结合左结合左结合)和从右向左和从右向左和从右向左和从右向左(右结合右结合右结合右结合)例如:例如:例如:例如:算术运算符为算术运算符为算术运算符为算术运算符为左结合左结合左结合
37、左结合 a-ba-b+4 4 赋值运算符为赋值运算符为赋值运算符为赋值运算符为右结合右结合右结合右结合 a=b=5a=b=5本章涉及的运算符本章涉及的运算符+-*/%+-+-=+=-=*=/=%=&=|=!=&|!&|?:,&sizeof (数据类型标识符)类型种类算术运算符赋值运算符关系运算符逻辑运算符位运算符条件运算符逗号运算符其他运算符表达式的有关概念表达式的有关概念l什么是表达式l由运算符将运算对象连接成的式子,它描述了一个具体的求值运算过程。l计算表达式的值l按照运算符的运算规则求值l求值时注意运算符的优先级和结合性l表达式值的类型l自动转换l强制转换 例如:例如:l表达式:150+
38、b*212.456 b=(+a)-2a/=a*=(a=2)f=abc-a|+b&c+max=ab?a:b a=3,a+=3,a*a 1/(float)a+6 算术运算算术运算l算术运算符的优先级()+-+-*/%+-同级 同级 同级 单目单目 双目双目 高高高高 低低低低l l没有乘方运算符没有乘方运算符没有乘方运算符没有乘方运算符,要计算,要计算,要计算,要计算a a3 3要写作要写作要写作要写作 a*a*a a*a*a 的连乘,的连乘,的连乘,的连乘,或用标准库函数或用标准库函数或用标准库函数或用标准库函数 pow(apow(a,3),3)l l“/”的运算对象可为各种类型数据,但是当进行
39、两的运算对象可为各种类型数据,但是当进行两的运算对象可为各种类型数据,但是当进行两的运算对象可为各种类型数据,但是当进行两个整型数据相除时,运算结果也是整型数据个整型数据相除时,运算结果也是整型数据个整型数据相除时,运算结果也是整型数据个整型数据相除时,运算结果也是整型数据 l l“%”要求运算对象必须是整型数据,功能是求两要求运算对象必须是整型数据,功能是求两要求运算对象必须是整型数据,功能是求两要求运算对象必须是整型数据,功能是求两数相除的余数,余数的符号与被除数的符号相同。数相除的余数,余数的符号与被除数的符号相同。数相除的余数,余数的符号与被除数的符号相同。数相除的余数,余数的符号与被
40、除数的符号相同。自增自减运算自增自减运算l+-是单目运算符l有前缀和后缀两种形式 l前缀形式:先自增(自减)再引用;l后缀形式:先引用再自增(自减);l功能:前缀形式 +a 等价于 a=a+1 -a 等价于 a=a 1 后缀形式 a+等价于 a=a+1 a-等价于 a=a 1表达式的值会不同表达式的值会不同例如:例如:当 a5 时 +a 表达式的值为 6,且 a6 a+表达式的值为5,且 a6 b=+a 等价于 a=a+1;b=a 表达式的值为6,且 a=6,b=6 b=a+等价于 b=a;a=a+1 表达式的值为5,且 a=6,b=5 说明:说明:l+和-的运算对象只能是变量(或运算结果是变
41、量的表达式),不能是常量(或运算结果是数值的表达式)。例如:5+、(a+2)+不合法。l具有右结合性,结合方向为从右到左。例如:a+等价于 -(a+)l如果有多个运算符连续出现时,C系统尽可能多的从左到右将字符组合成一个运算符例如:i+j 等价于 (i+)+j -i+-j 等价于-(i+)+(-j)赋值运算赋值运算l赋值运算符(右结合)=+=-=*=/=%=&=|=l赋值表达式l将表达式的值存入变量对应的内存单元中m=12b=(+a)-2 m%=3+n 等价于 m=m%(3+n)x*=(x=5)说明:说明:l赋值号左边必须是变量,右边可以是C语言任意合法的表达式例如:n=t+210 等价于:a
42、=(b=(b*c)10)l赋值号与数学中的等号含义不同例如:数学中 a=b 等价于 b=a C语言中 a=b 不等价于 b=a关系运算关系运算l关系运算符(左结合)=!=较高 较低l关系表达式l用关系运算符将运算对象连接成的式子 例如:12=c 等价于 a=(b=c)与 (a=b)=c 不等价l关系运算符优先于赋值,低于算术说明:说明:l关系运算的结果应该是逻辑值。C语言用数值用 1 表示逻辑真,0 表示逻辑假例如:75 的值是 1,57 的值是 0 ab的值是 0,a=z l逻辑运算符的优先级 和结合性:l!是单目运算符,右结合,高于算术l&和|是双目运算符,左结合,高于赋值运算符,低于关系
43、运算符逻辑运算规则逻辑运算规则l从左到右依次进行逻辑计算l运算对象为非0表示逻辑真l运算对象为 0 表示逻辑假l逻辑运算的结果为 0 或 1例如设:a=15,b=0,c=-2 a&b&c 结果为0 a|b|c 结果为1 (a+c)|b&c 结果为1逻辑运算规则(续)逻辑运算规则(续)l运算按照从左至右的顺序进行,一旦能够确定逻辑表达式的值,就立即结束运算逻辑运算的短路性质例如设:a=1,b=0,c=-2a&b&c(a+)|+b&-c为为 0,运算终止,表达式,运算终止,表达式值值为为 0为非为非0,运算终止,表达式值为,运算终止,表达式值为 1且且a为为2,b为为0,c为为-2(b,c保持原值
44、保持原值)关系与逻辑运算符的应用关系与逻辑运算符的应用l表示数学公式abc l判断a,b,c三条线段能否组成一个三角形 la,b不同时为负 a+bc&a+cb&b+caa=0|b=0!(a0&b0)(a=0)|(a=0&b=0&b=0)(a=0)|(a=0&b=0&b=0)ab&bc位运算符位运算符&|位逻辑运算符位逻辑运算符移位运算符移位运算符单目单目单目单目l l位运算符的运算对象只能是位运算符的运算对象只能是整型数据整型数据或或字字符型数据符型数据,不能是实型数据,不能是实型数据l l运算对象一律按二进制补码参加运算,并运算对象一律按二进制补码参加运算,并按位进行运算按位进行运算l l位
45、运算的结果是一个整型数据位运算的结果是一个整型数据低于单目、算术运算符,低于单目、算术运算符,高于其他运算符高于其他运算符低于单目、算术和关系运低于单目、算术和关系运算符,高于其他运算符算符,高于其他运算符位逻辑运算符的运算规则位逻辑运算符的运算规则 l假设ai和bi均是一个二进制位(bit)运算对象逻辑运算结果aibiai&biai|biai biai000001010111100110111100例如:例如:假设假设a=10,b=010 求求a&b、a|b、ab、a程序如下:程序如下:main()int a=10,b=010;printf(%d%dn,a&b,a|b);printf(%d%
46、dn,ab,a);输出结果:输出结果:8 108 102 -112 -11 0000 0000 0000 1010 0000 0000 0000 1010&0000 0000 0000 1000&0000 0000 0000 1000 0000 0000 0000 1000 0000 0000 0000 1000即:即:即:即:a&ba&b的值是的值是的值是的值是8 8 0000 0000 0000 1010 0000 0000 0000 1010 1111 1111 1111 0101 1111 1111 1111 0101即:即:即:即:aa的值是的值是的值是的值是-1111 1.按位与按
47、位与&设设 x=0 xad;(即10101101B)y=0 xcb;(即11001011B)求求 x&y。按按位位与与运运算算,当当两两位位皆皆为为1时时才才得得1,否否则得则得0。1 0 1 0 1 1 0 1&1 1 0 0 1 0 1 1 1 0 0 0 1 0 0 1 结果为结果为10001001B=89H。按位与口诀:按位与口诀:有有0 则则0,全全1才才1 例例9.1 编编写写程程序序,对对2个个十十六六进进制制数数进进行行按位与运算,并输出计算结果。按位与运算,并输出计算结果。#include void main()int x=0 xad,y=0 xcb;printf(%xn,x
48、&y);输出结果:输出结果:89 2按位或按位或|设设 x=0 x10;(即00010000B)y=0 x78;(即01111000B)求求 x|y。a和和b进进行行按按位位或或运运算算,当当对对应应位位皆皆为为0时时才得才得0,否则得,否则得1。0 0 0 1 0 0 0 0|0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0结果为:结果为:78H。按位或口诀:按位或口诀:有有1 则则1,全全0才才0 3按位取反按位取反 按位取反运算符要求按位取反运算符要求1个操作数。如:个操作数。如:a 对对a的每个二进制位取反的操作是:的每个二进制位取反的操作是:1变变0,0变变1。例如:例
49、如:a=0 xF9,求求a。a:11111001 a:00000110 即:即:06H 例例9.2 编编写写程程序序,对对整整数数6按按位位取取反反并并输输出。出。#include void main()int n=6;printf(%x,n);输出结果:输出结果:fff9 4按位异或按位异或 按位异或运算规则是:按位异或运算规则是:两位相异为两位相异为1,相同为,相同为0。例:例:x=0 x10;y=0 x35;求求 xy。0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 1 结果为:结果为:0 x25。8.十十六六进进制制数数0F本本身身进进行行异
50、异或运算的结果是或运算的结果是 。0F本本身身进进行行异异或或,就就是是两两个个相相同同的的数数进进行行异异或或。因因为为两两个个相相同同的的数数对对应应位位都都相相同同,根根据据“相相同同为为0”的的运运算算规规则则,所所以以每一位都是每一位都是0,即结果为,即结果为0。可可见见,要要将将某某寄寄存存器器或或内内存存单单元元清清0,用其自身值进行异或运算即可。用其自身值进行异或运算即可。移位运算移位运算l例如:ab-1 等价于 (a+8)(b-1)例如:例如:假设假设a=10,b=2,求,求ab-1 main()int a=10,b=2;printf(%d%dn,abab-1a+8b-1);