1、C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 教学目的与要求:教学目的与要求:1熟练掌握熟练掌握C的基本数据类型的基本数据类型2掌握掌握C语言的运算符,熟练掌握基本的运语言的运算符,熟练掌握基本的运 算符,掌握运算符的优先级及结合方向算符,掌握运算符的优先级及结合方向3了解了解C语言的各种表达式,掌握常用的几语言的各种表达式,掌握常用的几种表达式种表达式C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 一、一、C C的数据类型的数据类型二、运算符和表达式二、运算符和表达式三、本章小结三、本章小结C C语言程序设计语言程序设计
2、数据类型、运算符与表达式数据类型、运算符与表达式 (一)(一)数据类型数据类型概述概述(二)常量与变量(二)常量与变量(三)整型数据(三)整型数据(四)实型数据(四)实型数据(五)字符型数据(五)字符型数据(六)各类数值型数据间的混合运算(六)各类数值型数据间的混合运算C的数据类型的数据类型C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 (一)(一)C C的数据类型的数据类型C C 语言的数据结构是以数据类型形式出现的。语言的数据结构是以数据类型形式出现的。C C的数据类型如下:的数据类型如下:数据类型数据类型基本类型基本类型整型整型字符型字符型实实型(浮点型
3、)型(浮点型)单精度型单精度型双精度型双精度型枚举类型枚举类型构造类型构造类型数组类型数组类型结构体类型结构体类型共用体类型共用体类型指针类型指针类型空类型空类型C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 (二)常量与变量(二)常量与变量1.常量和符号常量常量和符号常量常量:常量:在程序运行过程中,其值不能被改变的量。在程序运行过程中,其值不能被改变的量。常量区分为不同的类型:如:整型常量(常量区分为不同的类型:如:整型常量(12、-3)、实型常量()、实型常量(4.6、-1.23)、字符常量()、字符常量(a、d)。)。符号常量符号常量:用一个标识符代表
4、一个常量用一个标识符代表一个常量,即标识符形式的常量。即标识符形式的常量。例例 3.1 符号常量的使用。符号常量的使用。#define PRICE 30 main()int num,total;num=10;total=num*PRICE;printf(“total=%d”,total);C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 (1)程序中用)程序中用#define命令行定义命令行定义PRICE为为30,此后凡在本文件中出现,此后凡在本文件中出现的的PRICE都代表都代表30,可以和,可以和常量常量一样进行运算。一样进行运算。(2)符号常量)符号常量不
5、同于不同于变量,它的值在其作用域内变量,它的值在其作用域内不能改变不能改变,也,也不能再不能再被赋值被赋值。如在本例中再用以下赋值语句给。如在本例中再用以下赋值语句给PRICE赋值是赋值是错误错误的:的:PRICE=40;(3)习惯上,习惯上,符号常量名符号常量名用用大写大写,变量名变量名用用小写小写,以示区别。,以示区别。上述程序的说明如下:上述程序的说明如下:使用符号常量的好处:使用符号常量的好处:(1)含义清楚含义清楚。如:如:sum=15*30*23.5*43;在检查程序时搞不清各个;在检查程序时搞不清各个常数究竟代表什么。应尽量使用常数究竟代表什么。应尽量使用“见名知意见名知意”的变
6、量名和符号常量。的变量名和符号常量。(2)在需要改变一个常量时能做到)在需要改变一个常量时能做到“一改全改一改全改”。如:如:#define PRICE 35在程序中所有以在程序中所有以PRICE代表的价格就会一律自动全改为代表的价格就会一律自动全改为35。C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 2.变变 量量变量变量:其值可以改变的量。其值可以改变的量。一个变量应该有一个名字,在内存中占据一定的存储单一个变量应该有一个名字,在内存中占据一定的存储单元。在该存储单元中存放变量的值。元。在该存储单元中存放变量的值。3变量值变量值存储单元存储单元a变量名变
7、量名 见见右图:右图:变量名变量名实际上是一个实际上是一个符号地符号地址址,在对程序编译连接时由系统给每,在对程序编译连接时由系统给每一个一个变量名变量名分配一个分配一个内存地址内存地址。在程。在程序中从变量中取值,实际上是通过变序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储量名找到相应的内存地址,从其存储单元中读取数据。单元中读取数据。C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 3.标识符:标识符:用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有用来标识变量名、符号常量名、函数名、数组名、类型名、文件名的有效字符序列称为效
8、字符序列称为标识符标识符。C语言规定语言规定标识符标识符只能由只能由字母字母、数字数字和和下划线下划线三种字符组成,且三种字符组成,且第一第一个字符个字符必须是必须是字母字母或或下划线下划线。下面列出的是。下面列出的是合法合法的的标识符标识符,也是,也是合法合法的的变变量名量名:Sum,average,_total,tan,lotus_1,BASIC,li_ling不合法不合法的标识符和变量名如右:的标识符和变量名如右:M.D.John,#33,3D64,ab(1)大写大写字母和字母和小写小写字母被认为是两个字母被认为是两个不同不同的字符。的字符。(2)变量名的)变量名的长度不要长度不要超过超
9、过8个字符。个字符。Turbo C允许允许32个字符。个字符。(3)所有用到的变量名都要)所有用到的变量名都要“先定义,后使用先定义,后使用”,特别指出每一,特别指出每一个变量各自属于什么类型。个变量各自属于什么类型。对于变量现说明如下:对于变量现说明如下:C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 (三)整型数据(三)整型数据1.整型常量的表示方法整型常量的表示方法整型常量即整常数。整型常量即整常数。C整常数可用以下三种形式表示:整常数可用以下三种形式表示:(1)十进制整数。如)十进制整数。如123,-456,0。(2)八进制整数。以八进制整数。以0开头
10、的数是开头的数是八八进制数。如:进制数。如:0123表示八进制数表示八进制数123,即,即(123)8,其值为:,其值为:182 28 1 380 ,等于,等于十十进制数进制数83。(3)十六进制整数。以)十六进制整数。以0 x或或0X开头的数是开头的数是十六十六进制数。进制数。如:如:0 x123,代表代表十六进制十六进制数数123C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 2.整型变量整型变量(1 1)整型数据在内存中的存放形式)整型数据在内存中的存放形式 数据在数据在内存内存中是以中是以二进制二进制形式存放的。如果定义了一个整型变量形式存放的。如果定
11、义了一个整型变量i:int i;/*定义为整型变量定义为整型变量*/i=10;/*给给i 赋以整数赋以整数10*/十进制数十进制数10的二进制形式为的二进制形式为1010,在,在C编译系统中,每一个编译系统中,每一个整型变量整型变量在内存中在内存中占占2个字节个字节。如下所示:。如下所示:i10(a)数据存放的示意图数据存放的示意图i0 0 0 0 0 0 0 00 0 0 0 1 0 1 0(b)数据在内存中实际存放的情况数据在内存中实际存放的情况C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 实际上,数值是以实际上,数值是以补码补码(complementc
12、omplement)表示的。一个表示的。一个正数正数的的补码补码和其和其原码原码的形式的形式相同相同。下图就是用。下图就是用补码补码形式表示的。形式表示的。如果数值是负的,在内存中如何用补码形式表示呢?求如果数值是负的,在内存中如何用补码形式表示呢?求负负数补码的方法数补码的方法是:将该数的是:将该数的绝对值绝对值的的二进制二进制形式,形式,按位取按位取反再加反再加1 1。例如:求例如:求-10的补码:的补码:10的原码的原码0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 取反取反1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1再加再加11 1 1 1 1 1 1
13、 1 1 1 1 1 0 1 1 0得得-10的补码的补码C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 (2)整型变量的分类)整型变量的分类 可以根据数值的范围将变量定义为可以根据数值的范围将变量定义为基本整型基本整型、短整型短整型或或长整型长整型。因。因此有以下三类整型变量:此有以下三类整型变量:基本整型,以基本整型,以int表示。表示。短整型,以短整型,以short int表示,或以表示,或以short表示。表示。长整型,以长整型,以long int表示,或以表示,或以long表示。表示。归纳起来,有以下归纳起来,有以下6种整型变量。即:种整型变量。即:
14、取值范围取值范围 字节数字节数 有符号基本整型有符号基本整型 signed int -3276832767 2 无符号基本整型无符号基本整型 unsigned int 065535 2 有符号短整型有符号短整型 signed short int -3276832767 2 无符号短整型无符号短整型 unsigned short int 065535 2 有符号长整型有符号长整型 signed long int -21474836482147483647 4 无符号长整型无符号长整型 unsigned long int 04294967295 4C C语言程序设计语言程序设计 数据类型、运算符与
15、表达式数据类型、运算符与表达式 如果如果不指定不指定unsigned或指定或指定signed,则存储单元中则存储单元中最高位最高位代表代表符号符号(0为正,为正,1为负)。如果为负)。如果指定指定unsigned,为无符号为无符号型,存储单元中全部二进制位(型,存储单元中全部二进制位(bit)用作存放数本身,而用作存放数本身,而不不包括符号包括符号。无符号型变量无符号型变量只能存放不带符号的整数,如只能存放不带符号的整数,如123、4687等,而等,而不能存放负数不能存放负数。如果在程序中定义如果在程序中定义a和和b两个变量:两个变量:int a;unsigned int b;则变量则变量a的
16、数值范围为的数值范围为-3276832767。而变量。而变量b的数值范围的数值范围为为065535。C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 (3)整型变量的定义)整型变量的定义对对变量的定义变量的定义,一般是放在一个函数的声明部分。,一般是放在一个函数的声明部分。例例3.2:整型变量的定义与使用:整型变量的定义与使用:main()int a,b,c,d;/*指定指定a、b、c、d为整型变量为整型变量*/unsigned u;/*指定指定u为无符号整型变量为无符号整型变量*/a=12;b=-24;u=10;c=a+u;d=b+u;printf(“a+u=
17、%d,b+u=%dn”,c,d);运行结果为:运行结果为:a+u=22;b+u=-14可以看到可以看到不同种类的整型数据可以进行算术运算。不同种类的整型数据可以进行算术运算。C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 (4)整型数据的溢出)整型数据的溢出 一个一个int型变量的最大值允许值为型变量的最大值允许值为32767,如果再加,如果再加1,会出现什么情况?会出现什么情况?例例 3.3 整型数据的溢出。整型数据的溢出。main ()int a,b;a=32767;b=a+1;运行结果为:运行结果为:32767,-32768 printf(“%d,%d”
18、,a,b);0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 a:1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0b:32767-32768从上图可以看到:从上图可以看到:变量变量a的最高为的最高为0,后,后15位全为位全为1。加。加1后变成第后变成第1位为位为1,后面,后面15位全为位全为0。而它是。而它是-32768的补码的补码形式,所以输出变量形式,所以输出变量b的值为的值为-32768。C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 注:注:一个一个int变量只能容纳变量只能容纳-3276832767范围内的范围内的数,无法
19、表示大于数,无法表示大于32767的数。遇此情况就发生的数。遇此情况就发生“溢出溢出”,但运行时并不报错。它好像汽车的里,但运行时并不报错。它好像汽车的里程表一样,达到最大值以后,又从最小值开始计程表一样,达到最大值以后,又从最小值开始计数。所以,数。所以,32767加加1得不到得不到32768,而得到,而得到 -32768,这与程序编制者的原意不同。因此,在操,这与程序编制者的原意不同。因此,在操作时要特别注意,或将变量作时要特别注意,或将变量b改成改成long 型就可得到型就可得到预期的结果预期的结果32768。C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达
20、式 3.整型常量的类型整型常量的类型 我们已知整型我们已知整型变量变量可分为可分为int、short int、long int和和unsigned int、unsigned short、unsigned long等类别。那么等类别。那么常量常量是否也有这些类别?在将是否也有这些类别?在将一个一个整型常量整型常量赋值给上述几种类别的赋值给上述几种类别的整型变量整型变量时如何做到时如何做到类型匹配类型匹配?请注?请注意以下几点:意以下几点:(1)一个整数,如果其值在)一个整数,如果其值在-3276832767范围内,认为它是范围内,认为它是int型,它型,它可以赋值给可以赋值给int型和型和lon
21、g int 型变量。型变量。(2)一个整数,如果其值超过了上述范围,而在)一个整数,如果其值超过了上述范围,而在-2147483648 2147483647范围内,则认为它是范围内,则认为它是长整型长整型,可以将它赋值给一个,可以将它赋值给一个long int 型变量。型变量。(3)一个)一个int 型的常量也同时是一个型的常量也同时是一个short int 型常量,可以赋给型常量,可以赋给int 型型或或short int 型变量。型变量。(4)一个整常量后面加一个字母)一个整常量后面加一个字母u,认为是认为是unsigned int 型,如型,如12345u,在内存中按在内存中按unsig
22、ned int规定的方式存放。规定的方式存放。(5)在一个整常量后面加一个字母)在一个整常量后面加一个字母l或或L,则认为是则认为是long int 型变量。型变量。C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 (四)实型数据(四)实型数据1.实型常量的表示方法实型常量的表示方法实数(实数(real number)又称浮点数(又称浮点数(floating-point number)。实数有两种表示形式:实数有两种表示形式:(1)(1)十进制小数形式十进制小数形式。它由。它由数字和小数点数字和小数点组成(组成(注意注意必须有必须有小数点)。如:小数点)。如:1
23、23.0 123.0、.123.123。(2)(2)指数形式指数形式。注意注意字母字母e e之前必须有数字,且之前必须有数字,且e e后面的指数后面的指数必须为整数。如:必须为整数。如:123e3123e3代表代表12312310103 3 。“规范化的指数形式规范化的指数形式”:即在字母:即在字母e e之前的小数部分,小数之前的小数部分,小数点左边应有一位(且只能有一位)点左边应有一位(且只能有一位)非零非零的数字。一个实数在的数字。一个实数在用指数形式输出时,是按用指数形式输出时,是按规范化规范化的指数形式输出的。的指数形式输出的。C C语言程序设计语言程序设计 数据类型、运算符与表达式数
24、据类型、运算符与表达式 实型数据实型数据类型类型比特数比特数有效数字有效数字数值范围数值范围floatdoublelong double3264128671516181910-38103810-3081030810-49321049322.实型变量实型变量如右图:实数如右图:实数3.141593.14159在内存中的存在内存中的存放形式。系统把一个放形式。系统把一个实型实型数据分成数据分成小数小数部分和部分和指数指数部分,分别存放。部分,分别存放。指数部分采用指数部分采用规范化规范化的指数形式。的指数形式。数符数符小数部分小数部分 指数部分指数部分.314159 101(1)实型数据在内存中的
25、存放形式)实型数据在内存中的存放形式常用的微机系统中一个实型数据在内存占常用的微机系统中一个实型数据在内存占4个字节个字节(32位位)。与整型。与整型数据的存储方式不同,实型数据是按照指数形式存储的。数据的存储方式不同,实型数据是按照指数形式存储的。(2 2)实型变量的分类)实型变量的分类 实型变量分为实型变量分为单精度单精度(float(float型型)、双精度双精度(double(double型型)和和长双精度型长双精度型(long double)(long double)三类。见下表:三类。见下表:(3 3)实型数据的舍入误差)实型数据的舍入误差 由于实型变量是用有限的存储单元存储的,因
26、此能提供的有效数字总由于实型变量是用有限的存储单元存储的,因此能提供的有效数字总是有限的,在有效位以外的数字将被舍去。由此可能会产生一些误差。是有限的,在有效位以外的数字将被舍去。由此可能会产生一些误差。C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 许多许多C编译系统将实型常量作为编译系统将实型常量作为双精度双精度来处理,来处理,可以将一个实型常量可以赋给一个可以将一个实型常量可以赋给一个float型、型、double型型或或long double变量。变量。如:如:float a;a=111111.111;由于由于float型变量只能接收型变量只能接收7位
27、位有效数字,因此后两位有效数字,因此后两位小数不起作用。若小数不起作用。若a改为改为double型,则能全部接收。型,则能全部接收。若将实型常量赋给若将实型常量赋给float型变量,其运算速度慢,为提型变量,其运算速度慢,为提高速度,可在常量后加上高速度,可在常量后加上f或或F。3.实型常量的类型实型常量的类型C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 (五)字符型数据(五)字符型数据1.字符常量字符常量C的字符常量是用单引号括起来的一个单字符,如的字符常量是用单引号括起来的一个单字符,如a。除了以上形式的字符常量外,还有一个以除了以上形式的字符常量外,还
28、有一个以“”开头的特开头的特殊的字符常量殊的字符常量(称为转义字符称为转义字符)。常见的有:常见的有:字符形式字符形式含含 义义ASCII 码码n换行换行,将当前位置移到下一行开头,将当前位置移到下一行开头tbr水平制表水平制表(跳到下一个(跳到下一个Tab位置)位置)退格退格,将当前位置移到前一列,将当前位置移到前一列109813回车回车,将当前位置移到本行开头,将当前位置移到本行开头f换页换页,将当前位置移到下页开头,将当前位置移到下页开头反斜杠反斜杠,字符,字符“”单引号单引号(撇号)字符(撇号)字符”双引号双引号字符字符ddd1到到3位位8进制数进制数所代表的字符所代表的字符xhh1到
29、到2位位16进制数进制数所代表的字符所代表的字符12923934C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 注意注意:在显示屏上最后得到的结果与上述打印结果不同。:在显示屏上最后得到的结果与上述打印结果不同。例例 3.4 转义字符的使用。转义字符的使用。main()printf(“ab c t de rftgn”);printf(“htibbj k”);程序运行时在程序运行时在打印机打印机上得到以下结果:上得到以下结果:fab c gdeh jikC C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 2.字符变量字符变量字符型变
30、量用来存放字符常量。字符型变量用来存放字符常量。注:注:一个字符变量只能放一个字符变量只能放一个一个字符。一个字符变量在内存中占一个字节字符。一个字符变量在内存中占一个字节例如:例如:char c1,c2;c1=a;c2=b;3.字符数据在内存中的存储形式及其使用方法字符数据在内存中的存储形式及其使用方法 将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的到内存单元中去,而是将该字符的相应的ASCII代码代码放到存储单元中。放到存储单元中。例如:字符例如:字符a的的ASCII代代码为码为9
31、7,b为为98,在内存,在内存中变量中变量c1、c2的值,见右图的值,见右图(a)所示;实际上是以所示;实际上是以二进制二进制形形式存放的,见右图式存放的,见右图(b)所示。所示。9798(a)c1c20110000101100010(b)C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 例例 3.5 向字符变量赋以整数。向字符变量赋以整数。main()char c1,c2;c 1=97;c 2=98;printf(“%c%c n”,c1,c2);printf(“%d%d n”,c1,c2);程序运行的结果:程序运行的结果:a b 97 98可以看到:可以看到:
32、字符型数据字符型数据和和整型整型数据数据是是通用通用的。它们既可以用的。它们既可以用字符形式输出(用字符形式输出(用%c),),也可也可以用整数形式输出(以用整数形式输出(%d)。)。注意:注意:字符数据只占字符数据只占一个一个字节,字节,它只能存放它只能存放0 255范围内的一范围内的一个整数。个整数。例例 3.6 大小写字母的转换。大小写字母的转换。main()char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(“%c%c“,c1,c2);运行结果为:运行结果为:A B 该程序的作用:将两个小写字母该程序的作用:将两个小写字母a和和b转换成大写字母转
33、换成大写字母A和和B。(从。(从ASCII代码表中可以看到一个小代码表中可以看到一个小写字母比它相应的大写字母的写字母比它相应的大写字母的ASCII码大码大32。)。)注意:注意:字符型字符型数据与数据与整型整型数据可数据可以以互相赋值互相赋值。举例:举例:C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 4.4.字符串常量字符串常量字符常量字符常量是由一对是由一对单引号单引号括起来的单个字符。而括起来的单个字符。而字符串字符串常量常量是由一对是由一对双引号双引号括起来的字符序列。括起来的字符序列。如:如:“How do you do”,“CHINA”;都是字符
34、串常量。都是字符串常量。可以输出一个字符串,如:可以输出一个字符串,如:printf(“How do you do”);注:注:a是是字符字符常量,常量,“a”是是字符串字符串常量,二者不同常量,二者不同。例如设例如设c为字符变量:为字符变量:char c;则则:c=a;正确正确 c=“a”;错误错误 也就是说也就是说 C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 C规定:在每一个字符串的结尾加一个规定:在每一个字符串的结尾加一个“字符串结束标字符串结束标志志”,以便系统据此判断字符串是否结束。,以便系统据此判断字符串是否结束。C规定以字符规定以字符0作为作
35、为字符串结束字符串结束标志。如:标志。如:“CHINA”,实际上是在实际上是在内存中是:内存中是:C H I N A 0它的长度不是它的长度不是5个字符,而是个字符,而是6个字符,最后一个字符个字符,最后一个字符为为0。但在输出时不输出。但在输出时不输出0。所以字符串。所以字符串“a”,实际上是包含实际上是包含2个字符:个字符:a和和0,因此,因此,把它赋给把它赋给 只能容纳一个字符的字符变量只能容纳一个字符的字符变量c:c=“a”;显然是不行的。显然是不行的。C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 (六)各类数值型数据间的混合运算各类数值型数据间的混
36、合运算整型和实型数据可以混合运算,字符型数据可以和整型通整型和实型数据可以混合运算,字符型数据可以和整型通用,因此,整型、实型、字符型数据间可以混合运算。例如:用,因此,整型、实型、字符型数据间可以混合运算。例如:10+a +1.5-8765.1234*b 是合法的。是合法的。在进行运算时,在进行运算时,不同类型不同类型的数据要的数据要先转换先转换成成同一同一类型(系类型(系统自动完成,无需人工干预)统自动完成,无需人工干预),按照下图进行运算:按照下图进行运算:高高 低低intunsignedlongdoublefloatchar,short注意:注意:箭头方向只表示数据类型箭头方向只表示数
37、据类型级别的高低,由低向高转换。级别的高低,由低向高转换。不不要理解为要理解为int型先型先转换成转换成unsigned int型,再转换成型,再转换成long型,再转成型,再转成double型。型。上述的类型转换是由系统自动进上述的类型转换是由系统自动进行的。行的。C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 运算符和表达式运算符和表达式(一)(一)C运算符简介运算符简介(二)算术运算符和算术表达式(二)算术运算符和算术表达式(三)赋值运算符和赋值表达式(三)赋值运算符和赋值表达式(四)强制类型转换运算符(四)强制类型转换运算符(五)逗号运算符和逗号表达式
38、(五)逗号运算符和逗号表达式C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 (一)(一)C运算符简介运算符简介:C的运算符有以下几类:的运算符有以下几类:1、算术运算符、算术运算符 8、指针运算符、指针运算符2、关系运算符、关系运算符 9、求字节数运算符、求字节数运算符3、逻辑运算符、逻辑运算符 10、强制类型转换运算符、强制类型转换运算符4、位运算符、位运算符 11、分量运算符、分量运算符5、赋值运算符、赋值运算符 12、下标运算符、下标运算符6、条件运算符、条件运算符 13、其他、其他7、逗号运算符、逗号运算符C C语言程序设计语言程序设计 数据类型、运算
39、符与表达式数据类型、运算符与表达式 1、基本的算术运算符:、基本的算术运算符:(加法运算符,或正值运算符。如:(加法运算符,或正值运算符。如:3+5、+3)(减法运算符,或负值运算符。如:(减法运算符,或负值运算符。如:5-2、-3)*(乘法运算符。如:(乘法运算符。如:3*5)/(除法运算符。如:(除法运算符。如:5/3)%(模运算符,或称求余运算符,(模运算符,或称求余运算符,%两侧两侧均应为均应为整型整型数数据,如:据,如:7%4的值为的值为3)需要说明的是需要说明的是:两个整数相除的结果为整数,但是,如:两个整数相除的结果为整数,但是,如果除数或被除数中有一个为负值,则舍入的方向是不固
40、果除数或被除数中有一个为负值,则舍入的方向是不固定的。多数机器采取定的。多数机器采取“向零取整向零取整”的方法,如:的方法,如:-5/3=-1,取整后向零靠拢。取整后向零靠拢。(二)算术运算符和算术表达式算术运算符和算术表达式 C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 2、算术表达式和运算符的优先级与结合性、算术表达式和运算符的优先级与结合性算术表达式:用算术表达式:用算术运算符算术运算符和和括号括号将运算对象(也称操作数)将运算对象(也称操作数)连接起来的、符合连接起来的、符合C语法规则的式子。语法规则的式子。运算对象运算对象包括包括常量常量、变量变量
41、、函数函数等。等。例如,例如,a-b*c 是一个合法的是一个合法的C算术表达式。算术表达式。C规定了各种运算符的规定了各种运算符的优先级优先级,上述表达式中,乘号优先上述表达式中,乘号优先于减号,因此,相当于于减号,因此,相当于a-(b*c)。如果在一个运算对象两侧的如果在一个运算对象两侧的运算符的优先级别相同,如:运算符的优先级别相同,如:a-b+c,则按规定的则按规定的“结合方结合方向向”处理。处理。C规定了各种运算符的规定了各种运算符的结合方向(结合性)结合方向(结合性),算术运算符,算术运算符的结合方向为的结合方向为“自左至右自左至右”,即先左后右,因此,即先左后右,因此b先与减号结先
42、与减号结合,执行合,执行a-b的运算,再执行加的运算,再执行加c的运算。的运算。C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 3、自增、自减运算符、自增、自减运算符作用是使变量的值增作用是使变量的值增1或减或减1。如:如:+i;-i;(在在使用使用i之之前前,先使,先使i的值加的值加(减减)1)i+;i-;(在在使用使用i之之后后,使,使i的值加的值加(减减)1)如果如果i的原值等于的原值等于3,则执行下面的赋值语句:,则执行下面的赋值语句:(1)、j=+i;(i的值先变成的值先变成4,再赋给,再赋给j,j的值为的值为4)(2)、j=i+;(先将先将i的值的
43、值3赋给赋给j,j的值为的值为3,然后,然后i变为变为4)注意:注意:(1)自增运算符自增运算符(+)和自减运算符和自减运算符(-),只能只能用于用于变量变量,而,而不能不能用于用于常量常量或或表达式。表达式。如如5+或或(a+b)+都是都是不合法不合法的。的。(2)+和和-结合方向是结合方向是“自右至左自右至左”。需知需知:符号运算符和:符号运算符和“+”运算符同优先级,其结合方向也为运算符同优先级,其结合方向也为“自右至左自右至左”。注注:-(i+)是先用是先用i的原值的原值3加上负号加上负号输出输出-3,再对,再对i加加1,不要不要认为认为先加完先加完1后再加负号,输出后再加负号,输出-
44、4,这是不对的。,这是不对的。C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 如果如果i的原值等于的原值等于3,则:,则:(1)避免出现歧义避免出现歧义。如:。如:i+i+i+应该写成:应该写成:i=3;a=i+;b=i+;c=i+;d=a+b+c;(2)不要写成:不要写成:i+j,而而应写成应写成:(i+)+j的的形式。形式。(3)不要写成:不要写成:printf(“%d,%d”,i,i+);其结果为:其结果为:4,3而而应写成应写成:j=i+;printf(“%d,%d”,j,i)其结果为:其结果为:3,44、有关表达式使用中的问题说明:、有关表达式使用中
45、的问题说明:C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 1、赋值运算符、赋值运算符赋值运算符赋值运算符就是就是“=”,它的作用是将一个,它的作用是将一个数据数据赋给一个赋给一个变量变量。如:。如:“a=3”的作用是执行一次赋值操作的作用是执行一次赋值操作(或称赋值运算或称赋值运算)。把常量。把常量3赋给变量赋给变量a。也可以将一个也可以将一个表达式的值赋给一个变量表达式的值赋给一个变量。(三)(三)赋值运算符和赋值表达式赋值运算符和赋值表达式2、变量赋初值变量赋初值程序中常需要对一些变量预先设置初值。程序中常需要对一些变量预先设置初值。C语言允许在定义变量
46、的语言允许在定义变量的同时使变量初始化。如:同时使变量初始化。如:int a=3;/*指定指定a为整型变量,初值为为整型变量,初值为3*/也可以使被定义的变量的也可以使被定义的变量的一部分赋初值一部分赋初值。如。如 int a,b,c=5;/*表示指定表示指定a,b,c为整型变量,为整型变量,c的初值为的初值为5*/如果要对几个变量赋予相同的初值,则:如果要对几个变量赋予相同的初值,则:int a=3,b=3,c=3;()int a=b=c=3;()或:或:int a,b,c;a=b=c=3;C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 3、复合的赋值运算符
47、复合的赋值运算符在赋值符在赋值符“=”之前加上其他运算符,可以构成复合之前加上其他运算符,可以构成复合的运算符。的运算符。例如,可以有:例如,可以有:a+=3 等价于等价于 a=a+3x*=y+8 等价于等价于 x=x*(y+8)(注意:括号的使用注意:括号的使用)x%=3 等价于等价于 x=x%3凡是二元凡是二元(二目二目)运算符,都可以与赋值符一起组合运算符,都可以与赋值符一起组合成复合赋值符。成复合赋值符。C语言规定可以使用语言规定可以使用10种复合赋值运算种复合赋值运算符:符:+=,-=,*=,/=,%=,=,&=,=,|=,后后5种是有关位运算的,将在第种是有关位运算的,将在第12章
48、介绍。章介绍。C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 (1)将将实型实型数据数据(包括单、双精度包括单、双精度)赋给赋给整型整型变量时,变量时,舍弃舍弃实数的实数的小数小数部分。部分。(2)将将整型整型数据数据赋给赋给单、双精度单、双精度变量时,数值变量时,数值不变不变,但以浮点数形式存储到,但以浮点数形式存储到变量中。变量中。(3)将一个将一个double型数据赋给型数据赋给float变量时,截取其前面变量时,截取其前面7位有效数字,存放到位有效数字,存放到float变量的存储单元变量的存储单元(32位位)中。中。注意:注意:数值范围不能溢出。数值范
49、围不能溢出。(4)字符型字符型数据数据赋给赋给整型整型变量时,由于字符只占变量时,由于字符只占1个字节,而整型变量为个字节,而整型变量为2个个字节,因此将字符数据字节,因此将字符数据(8位位)放到整型变量低放到整型变量低8位中。有两种情况:位中。有两种情况:(若字符若字符376)11 11 11 100 0 00 00 00 11 11 11 10c=376c=37611 11 11 101 1 11 11 11 11 11 11 10a、如果所用系统将字符处理如果所用系统将字符处理为为unsigned charb、如果所用系统将字符处如果所用系统将字符处理为理为signed char4、类型
50、转换、类型转换如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时系统会自动进行赋值时系统会自动进行类型转换类型转换。C C语言程序设计语言程序设计 数据类型、运算符与表达式数据类型、运算符与表达式 (5)将一个将一个int、short、long型数据赋给一个型数据赋给一个char型变量时,型变量时,只将其只将其低低8位位原封不动地送到原封不动地送到char型型变量。变量。(6)将带符号的整型数据将带符号的整型数据int型赋给型赋给long型变量时,要进行符型变量时,要进行符号扩展,将整型的号扩展,将整型的16位送到位送到l
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。