《3运算符和表达式.ppt》由会员分享,可在线阅读,更多相关《3运算符和表达式.ppt(60页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第第第3 3 3 3章章章章 运算符和表达式运算符和表达式运算符和表达式运算符和表达式2.5实型数据(浮点数)1浮点数两种表示形式:十进制形式和指数形式2浮点数常量系统缺省是以double存储3浮点型变量(取值范围与值的精度与机器有关)单精度(float型):占4字节,7位有效数字 双精度(double型):占8字符,15-16位有效数字4浮点数在内存中均是以指数形式存放的 数符-小数-阶符-指数,所以浮点数据有舍入误差第二章回顾复习第二章回顾复习 2.6字符型数据1字符(串)常量:用单(双)引号括起来的一个字符。转义字符P28(输出格式控制和输出字符两类)。2字符变量用来存放字符,且只能存
2、放一个字符。如:c1=a;c2=101;c3=0 x3f;c4=176;3字符数据的存储(1)将一个字符常量存放到一个字符变量中,是将该字符的相应的ASCII代码存放到存储单元中(2)字符数据与整型数据可以相互赋值(3)字符数据可以以字符形式输出,也可以用整型数形式输出 3.1.1 表达式的概念 表达式是用运算符与圆括号将操作数连接起来所构成的式子。C语言的操作数包括常量、变量、函数值等。例如:表达式(x+y)*7/sqrt(4.0)中:操作符有:+,*,/.操作数有:常量7,4.0;变量x,y;函数sqrt();表达式要有意义才能产生结果。3.1 表达式3.1.2 3.1.2 简单句简单句
3、在C语言中,将分号“;”加到一个表达式的后面就构成了简单语句。注意:在程序设计中,应该避免使用无意义的简单语句。例如:“3;”和“x+y;”这两个简单语句没有引起任何存储单元中数据的改变,是没有意义的简单语句。3.2.1 算术运算符的种类及运算方法 算术运算符有5种:“+”、“-”、“*”、“/”和取模“”(求余)。注意:1、*不能省,2*x不能写成2x2、(x+y)/(a+b)的括号少了,意义不同了3、C语言的除法要注意:两个整数相除,其值为整数,如:5/3值为1除数、被除数有一个为负值时,结果“向0取整”如-5/33.2 算术运算符为-1除数、被除数有一个为浮点数时,结果为double型4
4、、%(模运算符,或称求余运算符):%两侧均为整型数据,符号由被除数决定。如:-7%4为-3 7%-4为3 -7%-4为-33.2 算术运算符例例3.13.1:使用:使用printfprintf函数显示表达式的值。函数显示表达式的值。#include“#include“stdio.hstdio.h”void main()void main()printf(“%d,%f,%dn”,7/4,7/4.0,7%4);printf(“%d,%f,%dn”,7/4,7/4.0,7%4);程序运行结果如下:3.2.2 算术表达式及算术运算符的优先级 算术表达式就是用算术运算符和圆括号将操作数连接起来的式子。如
5、:3.14*r*r;x+sqrt(0.25*y)算术运算符的优先级:先乘除、后加减。取模与乘除的优先级相同。函数和圆括号的优先级最高。注意:(1)算术表达式应该能够正确地表达数学公式。(2)算术表达式的结果应该不超过其所能表示的数的范围。例3.2:验证超过表示范围的数。#include“stdio.h”void main()short int a=32767;/long int a=31767 short int b=3;/long int b=3 a=a+b;printf(“%dn”,a);运行结果如下:3.2.3 3.2.3 算术运算符的结合性(见附录算术运算符的结合性(见附录B B)运算
6、符的结合性是指运算顺序是从左到右,还是从右到左进行运算。分为“自右至左”(或称右结合)和“自左至右”(或称左结合)。例如:表达式 a+b-c C语言规定双目运算符的结合性是自左至右。赋值是将一个数据的值存放到一个变量中去。3.3.1 3.3.1 普通赋值运算符普通赋值运算符 赋值运算符“”,将赋值号右边表达式的解送到左边变量名所代表的存储单元内。格式是:变量名=表达式;如:a=5;ave=(a+b)/10;注意:(1)赋值号不是数学上的等号。(2)“a=b*(c=2);”能通过编译,它等价于两条语句“c=2”和“a=b*c”。(3)赋值运算符的优先级低于算术运算符,结合性是自右至左。如:a=(
7、b=4)+6 3.3 赋值运算符3.3.2 3.3.2 复合赋值运算符复合赋值运算符 把赋值符(=)之前加上其它运算符,构成了复合赋值运算符。(1)复合算术赋值运算符有:(掌握)+=,-=,*=,/=,%=;(2)与移位和位逻辑运算符结合的复合赋值运算符有:=,&=,=,!=。复合赋值运算符的使用规则:如:x+=2;等价于x=x+2;a*=b-2;等价于a=a*(b-2)注意有括号 算一算:a+=a-=a*a (a=2)3.4 不同数据类型数据间的混合运算 在计算表达式时,不但要考虑运算符的优先级和结合性,还要分析运算对象的数据类型。运算符对不同类型数据的计算结果有可能不同 如7/4=1;7/
8、4.0=1.75 不同类型的数据在一起运算时,需要转换为相同类型的数据。转换方式有两种:自动转换(隐式转换)和强制转换(显示转换)。自动转换是由系统提供的,而强制转换是由程序员编写程序时指定的。3.4.13.4.1自动转换自动转换 自动转换就是系统根据规则自动将两个不同数据类型的运算对象转换成同一种数据类型的过程。转换原则是:为两个运算对象的计算结果提供尽可能多的存储空间。char、short int、longfloatdouble高高 低低横向向右的箭头表示必需的转换。即遇到char或short型时,系统一律将其转换为int型参与运算。对于其它类型的数据,在两个运算对象类型不同时,按纵向箭头
9、表示的方向由低向高做转换。若两个运算对象的数据类型相同,则不做转换。short op long,先转换为long再做运算 int op int,不用转换直接按int做运算 注意:自动转换只针对两个运算对象,而不能对表达式的所有运算符进行一次性的自动转换。例如:表达式 5/4+3.2的计算结果是4.2,而表达式5.0/4+3.2的计算结果是4.45。3.4.2 3.4.2 强制转换强制转换 强制转换:程序员根据自己意愿将一种数据类型强制转换成另一种数据类型。强制转换的格式为:(数据类型名)操作对象 如:(long)a ,(float)(x+y)注意:强制转换并不改变操作对象本身的数据类型和数值。
10、C语言的库函数对参数的数据类型有规定,如果实际参数不符合规定,则使用强制转换:如:int i;double f;f=sqrt(double)i);3.4.3 3.4.3 赋值表达式的类型转换赋值表达式的类型转换 赋值表达式:变量=表达式 “”左边的变量与“”右边的表达式的数据类型相同时,不需要进行转换。不同时,系统负责将右边的数据类型转换成左边的数据类型。转换有两种情况:一种是安全的,转换后不会丢失数据;一种是不安全的,转换后发生了数据丢失。(这与赋值号两边的数据类型所占字节数及数据存储表示方式有关)编写程序时应注意的原则:尽量不要进行数据类型间的转换,如果要进行,可以在同种类的数据类型间做长
11、度增大的转换,但不要做长度减小的转换。VC+6.0中:short2字节,int4字节,long4字节,float4字节,double8字节 例3.3 同类型但长度不同的数据之间的安全转换。运行结果如下:运行结果如下:例3.4 同类型但长度不同的数据间的非安全转换。运行结果如下:运行结果如下:注意:在VC+6.0中的运行结果是正确的,并不意味着在其他编译环境下的运行结果也是正确的,因为相同数据类型的数据在不同的编译环境中所占位数有可能不同。因此,为了程序有很好的可移植性,应该尽量避免在不同的数据类型之间进行复制转换。关系运算符是比较两个数值的大小的运算符。关系运算符有六个:,=,=10)&(x算
12、数运算符关系运算符逻辑与和逻辑或赋值运算符逻辑非结合性是自右至左;逻辑与和逻辑或的结合性是自左至右。如:计算表达式 79-!0 的值。(同学们在书写复杂表达式,要加括号来明确运算顺序)(1)79-1 (2)78 (3)1&3|0 (4)1|0 (5)值为1要注意的问题:C语言中,如果逻辑运算符的左操作数已经能够确定表达式的解,则系统不在计算右操作数的值。如:表达式 x=1&y=0 若x不为1,则系统在检测了x=1后,就不再检测y=0。+i,-i在使用i之前,先使i的值加1或减1i+,i在使用i之后,使i的值加1或减1例:自增自减运算 四点注意:P46#include stdio.h void
13、main()int i=0,j;j=i+;printf(%d%dn,i,j);i=0;j=+i;printf(%d%dn,i,j);3.73.7增增1/1/减减1 1运算符运算符位运算:对二进制位进行的操作和控制。位运算有六个运算符:按位取反、左移、按位与&、按位或|、按位异或。其中只有一个单目运算符:按位取反。3.8 3.8 位逻辑运算符(了解)位逻辑运算符(了解)1.按位与&按位与的运算规则是:0&0=0,0&1=0,1&0=0,1&1=1如:char w1,w2,w3;w1=10;w2=8;w3=w1&w2;则w3的内容可以通过下面的式子计算:00001010&00001000 结果 0
14、0001000&运算经常用于把特定位清零(屏蔽)。例如:a 1101 1010 b 1111 0000 a&b 1101 0000相当于把a的低四位屏蔽,高四位不变 应用:若要把某数的某些二进制位取出来,可以把其他位清零,把需要取出来的位同1进行按位与运算即可。2.按位或|按位或的运算规则是:0|0=0,0|1=1,1|0=1,1|1=1如:char w1,w2,w3;w1=10;w2=8;w3=w1|w2;则w3的内容可以通过下面的式子计算:00001010|00001000 结果 000010103.按位异或按位异或的运算规则是:00=0,01=1,10=1,11=0如:char w1,w
15、2,w3;w1=10;w2=8;w3=w1w2;则w3的内容可以通过下面的式子计算:0000 1010 0000 1000 结果 0000 00103.按位异或运算符能使特定位按位取反,方法是将这些特定位与1进行异或运算。例如:1101 1010 0000 1111 结果 1101 0101应用:按位异或运算能使特定位取反,方法是将这些特定位与1进行异或运算。4.按位取反按位取反的规则是:0=1,1=0.5.移位运算符 C语言有两个移位运算符,即左移“”均为双目运算符。运算符右边的表达式表示移位的位数。如:x=x2 表示对x进行左移以后赋值给x左移可以成指数级增大原数。右移可以成指数级缩小原数
16、。右移时,若符号位为0,则左边填0;若符号位为1,则要根据计算机的不同区分是算数移位(填1)还是逻辑移位(填0)。移位运算符的优先级低于算数运算符而高于关系和逻辑运算符;按位与、或、异或三个运算符的优先级低于关系运算符而高于逻辑运算符。3.93.9逗号表达式逗号表达式形式:表达式1,表达式2,,表达式i作用:用于连接表达式 如:3+5,6+8计算过程:(1)求解表达式1 (2)再求解表达式2,,表达式i (3)整个逗号表达式的值是表达式i的值一个逗号表达式又可与另一个表达式组成一个新的逗号表达式。如:(a=3*5,a*4),a+5逗号表达式是其它运算符中级别最低的。如:x=(a=3,6*3)1
17、8 x=a=3,6*a x里是3 逗号表达式是183.10 3.10 求字节数运算符求字节数运算符 sizeof是单目运算符,用于动态分配空间。其语法格式为:sizeof(表达式)表达式可以是变量名、常量以及数据类型名。功能是:求表达式所代表的存储单元所占的字节数例如:sizeof(int)结果是4sizeof运算符使用灵活,可以用不同的方法求整型数据所占的字节数:方法 sizeof(int)方法 sizeof(10)方法 int a;sizeof(a)例3.8 求各种类型数据在内存中所占的位数。例3.9 求各种类型数据在内存中所占的位数。实际上,指针是地址,是一个存储单元的地址,存放地址的变
18、量就是指针变量。在scanf函数中,“&”是取地址运算符。使用scanf函数时,必需提供存储单元的地址,如果将“scanf(“%d”,&score)”写成了“scanf(“%d”,score)”运行时会出现错误,无法接收用户的输入。3.10 3.10 指针类型与指针运算符指针类型与指针运算符3.10.1 指针数据类型 在程序运行时,所有的程序和数据都存放在内存单元中,内存是以一个字节为单位的连续的存储空间,每个内存单元都有一个编号,称为内存地址。每个变量都有自己的内存地址,系统对内存单元进行存取操作时,需要通过地址找到相应的内存单元。3.10.1 指针数据类型假设变量i的地址是2000,变量i
19、的内容是400,可以用下图来表示存储状况。2000 400 i对于简单数据类型的变量,通过变量名就可以对内存单元进行操作,例如 i=400。很多高级语言不允许通过变量的内存地址来访问内存单元,C语言允许。3.10.1 指针数据类型指针数据类型指针变量指针变量:对于变量:对于变量i,如果用另一个变量记,如果用另一个变量记住它的地址,那么这个记住其他变量地址住它的地址,那么这个记住其他变量地址的变量就是的变量就是指针类型的变量指针类型的变量。2000 400 i 2000p3.10.1 指针数据类型严格地说,一个指针是一个地址值,是一个不能变化的值。而一个指针变量的内容是可以变化的,可以是不同的地
20、址值。在不引起混淆的情况下,经常把指针变量简称为指针。比如当p指向i时,可以说p是i的指针。指针变量同样需要先定义后使用。3.10.1 指针数据类型指针变量的定义格式:指针所指对象的数据类型*指针变量名1,例如:int*p;定义了一个指向整型的指针变量p。如果指针变量未被赋过值,指针变量的值将是不定值。如何给指针变量赋值?例:int i;int*p;p=&i;3.10.2 指针运算符&和*的使用 两个指针运算符:取地址运算符&;取内容运算符*;最后一句使用了取内容运算符*,其含义是将3赋给p所指向的存储单元i,结果是变量中的内容变成了3。例:例:int i;int*p;p=&i;*p=3;3.
21、10.2 指针运算符&和*的使用定义指针和使用指针运算符时需要注意:(1)如果有了定义“int*p;”,说明p是指针变量,p的内容是地址,通过取地址运算符可以使其指向另外一个存储单元,p本身要占一个存储单元。(2)在定义指针变量时,可以将其定义为指向任何一种基本类型数据的存储单元,当使用取地址运算符为其赋值时,所指变量的数据类型应与定义时一致。3.10.2 指针运算符&和*的使用定义指针和使用指针运算符时需要注意:例如:int i;float*p;p=&i;(3)要注意“*”的不同含义,它可以作为算术运算符,可以用于定义指针,还可以存取指针所指的存储单元的内容。(4)指针只是概念上的地址,不必
22、关心它的具体数值,C程序中不可直接将内存地址赋给一个指针变量。3.10.2 指针运算符&和*的使用定义指针和使用指针运算符时需要注意:例如:int*p;p2000;是错误的。(5)指向相同数据类型的指针变量可以相互赋值,指向不同类型对象的指针一般不要相互赋值,除非进行强制转换。例:例:int i;int*py=&i;int*px;px=py;3.10.2 指针运算符&和*的使用例3.10 分析下面程序的运行结果。data 7 y?pointer例3.10 的运行结果。3.10.2 指针运算符&和*的使用使用指针运算符*和&时需要注意:(1)必需注意运算符之间的优先级。*和&是同级的,运算符与操作数的结合方式是从右至左。(2)运算符&只能用于普通变量,不能用于表达式或常量。(3)&x不能出现在赋值号的左边。3.10.2 指针运算符&和*的使用例3.11:分析下面程序的运行结果。例3.11的运行结果。例3.12:指针作为scanf函数的参数。例3.12的运行结果。课后作业课后作业