900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > c语言程序设计运算符及表达式 C语言程序设计3第3章运算符和表达式.ppt

c语言程序设计运算符及表达式 C语言程序设计3第3章运算符和表达式.ppt

时间:2019-12-05 19:58:44

相关推荐

c语言程序设计运算符及表达式 C语言程序设计3第3章运算符和表达式.ppt

退出退出 第3章 运算符和表达式 3.1 表 达 式 3.2 运算符及表达式 3.3 运算符优先级和结合性 3.1 表 达 式 C语言的表达式分为基本表达式和复杂表达式。 基本表达式是由以下单项构成的,即:标识符、 常量、字符串字面量和用圆括号括起来的表达式。 将基本表达式通过运算符连接在一起,就构成复 杂表达式。例如:2+8,a+b,(x-y)/a等。 由表达式还可组成更大的表达式。例如: x=(a+b)% 10 3.2 运算符及表达式 运算符是在一个数学运算中表示相应运算动作的 一种符号。 运算符所作用的对象称作运算分量。 3.2.1 算术运算符和算术表达式 在C语言中,基本算术运算符有5个,它们是: +(加) -(减) *(乘) /(除) %(取模) 算术运算符和运算分量组成的求值序列称作算术 表达式。 要注意运算符“/” 和 “%” 的区别。 运算符 “/” 可以作用于算术类型。 运算符“%”却只能作用于整型量。 a/b表示两个整数进行整除,其结果是舍弃余数后 所得到的商值。 是取整数除法的余数,而不管商的值是多少。 例3-1:算术运算符应用示例。 /* arithmetic practice */ #include void main() { int a=99; int b=5; int c=11; int d=3; int result; result=a-b; printf(“a-b=%d\n“,result); result=b*c; printf(“b*c=%d\n“,result); result=a/b; printf(“a/b=%d\n“,result); result=a%b; printf(“a%%b=%d\n“,result); result=a%d+b/c; printf(“a%%d+b/c=%d\n“,result); } 输出结果是: a-b=94 b*c=55 a/b=19 a%b=4 a%d+b/c=0 例3-2:计算有多个算术运算符的算术表达式。 #include void main() { int x,a=3; float y; x=20+25/5*2; printf(“(1)x=%d\n“,x); x=25/2*2; printf(“(2)x=%d\n“,x); x=-a+4*5-6; printf(“(3)x=%d\n“,x); x=a+4%5-6; printf(“(4)x=%d\n“,x); x=-3*4%-6/5; printf(“(5)x=%d\n“,x); x=(7+6)%5/2; printf(“(6)x=%d\n“,x); y=25.0/2.0*2.0; printf(“(7)y=%f\n“,y); } 输出结果是: (1)x=30 (2)x=24 (3)x=11 (4)x=1 (5)x=0 (6)x=1 (7)y=25.000000 3.2.2 赋值运算符和赋值表达式 赋值运算符“=”,其简单的使用形式是: 变量=表达式 这种形式的整个表达式称作赋值表达式。在使用 赋值表达式时应注意以下几点: ① 在赋值运算符左边的量(通常称为左值)必须是 变量,不能是常量或用上述运算符结合起来的表达式 。 int a,b; a=b;b=8; 是正确的赋值形式; 6=a;a+b=14; 等形式都是不对的。 ② 赋值运算可连续进行。例如, a=b=c=0 a=(b=(c=0)) ③ 赋值运算符的优先级比上述运算符的优先级都 低。 a=(b=9)*(c=7) ④ 赋值表达式的值等于右边表达式的值,而结果 的类型由左边变量的类型决定。 ⑤ 除了上述基本的赋值运算符之外,C语言中还 提供了另外10个赋值运算符,它们是: += -= *= /= %= >>= < <= &= |= ^= 这些运算符是把“运算”和“赋值”两个动作结合在 一起,往往把它们称为复合赋值运算符。 x +=2 其等效形式是:x=x+2。 表达式 x *=y+5 的等效形式是:x=x*(y+5)。 而表达式 x %=y-10 的等效形式是:x=x%(y-10) 复合赋值运算符右边的表达式应作为一个整体对 待。 3.2.3 增量运算符和增量表达式 自增运算符“++”和自减运算符“――”。它们都 是单目运算符。当出现在运算分量的前面时,例如+ +i、――i,就称之为前缀运算符;当出现在运算分量 的后面时,例如x++、y――,就称之为后缀运算符 。由增量运算符和运算分量构成的表达式称为增量表 达式。 1.自增运算符 ++n 这个表达式执行后,n的值增1。 还可采用“后缀加”的形式: n++ 但必须指出,并非在任何情况下二者都等价。 例3-3:显示前缀加和后缀加的区别。 #include void main() { int a,b,c; a=9; b=++a; printf(“ (1) a=%d ***b=%d\n“,a,b); a=9; c=a++; printf(“ (2) a=%d ***c=%d\n“,a,c); } 运行后输出的结果是: (1)a=10***b=10 (2)a=10***c=9 执行b=++a,这条语句等价于下述两条语句: c=a+1; b=a; 而改为后缀加形式,即:c=a++,这条语句等 价于下述两条语句: c=a; a=a+1; 简而言之,在表达式中出现前缀加的情况下,前 缀加所作用的运算分量值先增1,然后进行其他级别较 低的运算;而在表达式中出现后缀加的情况下,先以 其运算分量的当前值参与其他级别较低的运算,最后 该运算分量值才增1。 例3-4:复合赋值符和自增运算符“++”的应用。 Void main( ) { int x=2,y,z; x *=3+2; printf(“(1)x=%d\n“,x); x *=y=z=4; printf(“(2)x=%d\n“,x); x=y=1; z=x++ -1; printf(“(3)x=%d***z=%d\n“,x,z); z=x++ * ++y; printf(“(4)x=%d***y=%d***z=%d\n“,x,y, z); } 输出结果是: (1)x=10 (2)x=40 (3)x=2***z=0 (4)x=3***y=2***z=4 2.自减运算符 “――n”就等价于: n=n-1 它也分前缀减和后缀减两种形式。 m=--n; 等价于:n=n-1; m=n; 而 m=n--; 却等价于:m=n; n=n-1; 在使用增量运算符时,还应注意以下几点: ① 增量运算符有副作用。就是说,增量运算符作 用于运算分量时,如“++a”,不仅可以向外提供一个 值,而且还改变运算分量自身的值。例如: x=++i+i 或者 x=i+(++i) ② “++”和“――”是单个运算符,不是通常意义 上的两个“加”号或者两个“减”号。 ③x=i+++j; 是理解成(i++)+j,还是i+(++j)呢?C语言词 法分析遵循“最长匹配” 原则,即:如果在两个运算分 量之间连续出现多个表示运算符的字符(中间没有空格) ,那么,在保证有意义的条件下,就从左到右尽可能 多地将若干个字符组成一个运算符。所以,表达式就 解释为(i++)+j,而不是i+(++j)。建议读者在录入 程序时,在各个运算符之间加入空格,或者使用圆括 号,把有关部分括起来,使之作为整体处理。 ④ “++”和“――”只能作用在变量上,如“a++ ”,“――n”等,而不能用于常量和一般表达式(不是 左值的表达式)。 另外,增量运算符与运算分量结合在一起构成的 表达式带有自身赋值含义,但这种表达式不是左值, 不能直接出现在赋值号左边。 3.2.4 关系运算符和关系表达式 C语言有完整的一组关系运算符,用于比较两个运 算分量间的大小关系。这组运算符有6个,即: > >= < <= == != 用关系运算符将两个运算分量连在一起构成的表 达式称作关系表达式。根据运算符所作用的两个运算 分量之间的指定关系是否成立,分别得到关系表达式 的“真”、“假”结果。 在C语言中,没有表示“真”、“假”的逻辑量TRUE( 真)和FALSE(假),就借用数值来表示。以数值0表示“ 假”,以非0值表示“真”。对于关系表达式来说,结果 的真、假分别用1和0表示。 关系运算只判定两个运算分量是否满足指定的关 系,而不理睬二者具体数值相差多少。 应注意,赋值号“=”与全等比较运算符“==”的 区别。 关系运算符的优先级低于算术运算符。 a+b<c+d 应理解为:(a+b)<(c+d) 前4个关系运算符的优先级相同,后两个相等比较 运算符的优先级也相同。但前者的优先级恰好比后者 高一级。 例3-4:分析下面程序的运算结果。 1 void main() 2 { 3 int a,b,c; 4 a=b=c=10; 5 a=b= =c; 6 printf(“ a=%d,b=%d,c=%d\n“,a,b,c); 7 a= =(b=c++*2); 8 printf(“ a=%d,b=%d,c=%d\n“,a,b,c); 9 a=b>c>=100; 10 printf(“ a=%d,b=%d,c=%d\n“,a,b,c); 11 } 上述程序运行之后的输出结果是: a=1,b=10,c=10 a=1,b=20,c=11 a=0,b=20,c=11 3.2.5 条件运算符和条件表达式 C语言中提供的条件运算符“?:”是惟一的三目运 算符。 由条件运算符组成的表达式简称为条件表达式, 或三目表达式。其一般构成形式是: 表达式1?表达式2:表达式 3 决定条件表达式值的方法是:先计算表达式1的值 ;若该值不为0,则计算表达式2的值,并将表达式2的 值作为整个条件表达式的值;否则,就计算表达式3的 值,并将该值作为整个条件表达式的值。 例如,要求出x和y中最大的一个,并赋予变量max 。 max=(x>y)?x:y; 使用条件运算符时,还要注意以下几点: ① 条件运算符的优先级稍高于赋值运算符,但比 其他运算符的优先级都低。 ② 三个运算分量不限于简单的算术表达式,甚至 可以是函数调用。 ③ 分析条件表达式时,关键是先找出“?”和“:” ,把三个运算分量区分开,然后按一般方法进行计算 。 例3-5:分析下面程序运行的结果。 1 void main() 2 { 3 int a,b,c; 4 a=b=c=1; 5 a +=b; 6 b +=c; 7 c +=a; 8 printf(“ (1)%d\n“,a>b? a:b); 9 printf(“ (2)%d\n“,a>c? a--:c++); 10 ( a>=b>=c)? printf(“ AA“):printf(“ CC“); 11 printf(“ \n a=%d,b=%d,c=%d\n“,a,b,c) ; 12 } 3.2.6 逗号运算符和逗号表达式 在C语言中,逗号的用途主要有两种:一是作为分 隔符,二是作为运算符。 (1)逗号分隔符 用来分开相应的多个数据。 int a,b,c; printf(“ A=%d\t B=%d\n“,a,b); (2)逗号运算符 逗号作为运算符时,是把两个运算分量“连接”起 来,使之构成一个逗号表达式。 逗号表达式的一般形式是: 表达式1,表达式2 它的执行过程是:先计算表达式1,然后计算表达 式2。整个逗号表达式的值是表达式2的值。 逗号表达式的扩展形式是: 表达式1,表达式2,…表达式n 各个表达式必须从左到右顺序执行,而整个逗号 表达式的值是其中最右边表达式的值。 x=(i=10,j=5,i*j) 逗号运算符在所有运算符中是级别最低的。 3.2.7 逻辑运算符和逻辑表达式 C语言中逻辑运算符有3个,它们是: ! 逻辑非(相当于其他语言中的NOT) && 逻辑与 (相当于其他语言中的AND) || 逻辑或 (相当于其他语言中的OR) 其中,“!”是单目运算符,而&&和 || 是双目运算 符。 由逻辑运算符和运算分量构成的表达式称为逻辑 表达式。 (1)逻辑非运算符! 作用在单个运算分量上,其结果是运算分量逻辑 值的“反”。 (2)逻辑与运算符&& 作用在前后两个运算分量上,其结果是:仅当两 个运算分量同时为真时,结果才为真;否则,只要其 中有一个为假,结果就为假。 (3)逻辑或运算符 || 作用在前后两个运算分量上,其结果是:只要其 中有一个运算分量为真,结果就为真;仅当二者同时 为假时,结果才为假。 这三个逻辑运算符的优先级是:!的优先级高于 &&的优先级,&&的优先级又高于 || 的优先级。 例3-7:判断给定的某一年是否是闰年。 什么是闰年呢?如果某年号能被4整除而不能被 100整除,或者能被400整除,那么这年就是闰年;否 则就是平年。 下面的程序对用户输入的年号判别是否是闰年。 1 /* determing if a year is a leap year */ 2 #include 3 4 Void main() 5 { 6 int year,leap; 7 printf(“ Input your year .\ n“); 8 scanf (“ %d “,&year); 9 leap=year%4==0&& year % 100 != 0 || year % 400==0; 10 if (leap) 11 printf (“ %d is a leap year .\ n“,year); 12 else 13 printf (“ %d is not a leap year .\ n“,year); 14 } 在使用逻辑运算符时应注意以下几点: ① 用逻辑运算符把运算分量连接起来就构成逻辑 表达式。其运算分量可以是关系表达式、算术表达式 等,甚至还可以是逻辑表达式。 ② !的优先级高于算术运算符的优先级。 运算符!的结合性是从右到左,而&&和 || 的结合 性是从左到右。 ③ 逻辑表达式的值只有两个:0和1。以0代表逻辑 结果为假;以1代表逻辑结果为真。 ④ 运算符&&和 || 保证左边的运算分量优先得到计 算。就是说,由&&和 || 构成的逻辑表达式严格地从左 到右进行计算,并且一旦根据左分量的值就能确定整 个逻辑表达式的值时,就不再执行后面的运算。 例如, x=y=z=1; ++x || ++y&&++z; 执行之后,x、y和z的值分别是2,1,1。 3.2.8 位逻辑运算符和位逻辑表达式 1.二进制 只用0和1两个数字来表示所有的数。二进制数的 基本规则是“逢二进一”。 2.八进制和十六进制 八进制数是以8为基底的数,用到的数字是0,1, 2,…,7,一共8个。它的基本进位规则是“逢八进一” 。 八进制整常数是以数字0开头的八进制数字串。 二进制数与八进制数之间很容易进行转换。对于 一个二进制数来说,从右向左每三个数字为一组分开 ,把每组二进制数转为八进制数表示。 将八进制数转换成二进制数时,只要将每位八进 制数字用三位二进制数表示,串起来就是相应的二进 制数。 十六进制数是以十六为基底的数,它由数字0,1 ,2,…,9和字母A,B,C,D,E,F(或者a,b,c ,d,e,f)来表示。其基本进位规则是“逢十六进一”。 在C语言中,十六进制整常数是以0x或0X开头的 十六进制数字串,例如0x12、0X5a8。 二进制与十六进制的转换也很容易:对于一个二 进制数来说,从右向左每四个数字为一组,把每组二 进制数用十六进制数字表示。把十六进制数的每一位 数字用四位二进制数表示,串起来就是相应的二进制 数。 3.原码、反码和补码 在计算机内表示数值的方法是不同的,一般有: 原码、反码和补码。 (1)原码 通常,整数用一个字长表示。一般用最左边的一 位(称作最高位)表示数的符号:以0代表正,1代表负。 二进制数的原码表示形式是:最高位用于符号位 ,其余各位是数值的绝对值。 (2)反码 正数的反码与原码相同。负数的反码是:原码除 符号位外(仍为1),各位取反。 (3)补码 正数的补码与原码相同。除最高位仍为1外,原码 的其余各位求反,最后再加1 4.位逻辑运算符和位逻辑表达式 在C语言中,位逻辑运算符有以下4个: & ( 按位与 ) | ( 按位或 ) ~ ( 按位反 ) ^ (按位异或 ) 它们都是按二进制一位一位地进行运算,相邻位 之间不发生联系,即没有“进位”、“借位”等问题,所 以称为位逻辑运算符。 各个位逻辑运算符的优先级关系是:~最高,其余 3个运算符的优先级从高到低依次是&、^、|,但三者 都高于逻辑运算符而低于关系运算符。 由位逻辑运算符和运算分量构成的表达式称作位 逻辑表达式。 位逻辑运算符与逻辑运算符之间的区别: ① 位逻辑运算符是针对二进制位的,而逻辑运算 符是针对整个表达式的;位逻辑运算符要计算表达式 的具体数值,而逻辑运算符只判别表达式的真与假。 ② 位逻辑运算符&、|和 ^的两个运算分量是可交 换的;而逻辑运算符&&和||的两个运算分量都是不可 交换的,并且它们严格从左到右运算。 3.2.9 移位运算符和移位表达式 C语言中实现移位功能的运算符有两个:<<(左 移)和>>(右移)。它们都是双目运算符,并且要求两 个运算分量都是整型量。由移位运算符和运算分量构 成的表达式称作移位表达式。 (1)左移运算符<< 它的一般使用形式是: 表达式1<<表达式2 它的功能是:把表达式1的值(以二进制形式表示) 向左移动n位,n值由表达式2确定,并且表达式2的值 必须是正整数。 例如,a =00001011,那么,移位表达式 a<<3 的结果是01011000,即:把a的各二进位全部向左移3 位,右边空出的位补0,而左边溢出的位被丢弃不管。 (2)右移运算符>> 它的一般使用形式是: 表达式1>>表达式2 它的功能是:把表达式1的值(以二进制形式表示) 向右移n位,n的值由表达式2确定(该值必须是正整数 ) 例如,a=00001011,那么,移位表达式 a>>3 的结果是00000001,即:把a的各二进位全都向右移3 位,右边溢出的位被丢弃,而左边空出的位(在本例情 况下)补0。 在右移时,要注意符号位问题。 3.2.10 其他运算符 (1)& 和 * 单目运算符&用来取出其运算分量的地址,例如, int a,*p; p=&a; “*”也是单目运算符,它是“&” 的逆运算。它把运 算分量(应是指针量)所指向的内存单元中的内容取出来 。例如, b=*p; (2)强制类型运算符( ) 一般使用形式是: (类型名)表达式 它把表达式的类型强制转换成圆括号中“类型名” 所指定的类型。 (double)a 这是类型的临时转换方法。 (3)sizeof 单目运算符sizeof用来计算某种类型的变量或某种 数据类型在计算机内部表示时所占用的字节数。例如 : sizeof(int) (4)单目加“+”和单目减“-”运算符 单目加“+”运算的结果仍是其运算分量的值 负号(―)的运算结果是其运算分量的负值 (5)基本运算符 [ ] ( ) -> · 其中,[ ]用于数组下标的表示,( )用于标识函数, “->”和“”用于存取结构或联合中的成员。它们的优 先级在所有运算符中是最高的。 3.3 运算符优先级和结合性 ① 所有运算符的优先级共分为15级。基本运算符 的优先级最高(为15),逗号运算符的优先级最低(为1) 。 ② 当不同类型的运算符出现在一个表达式中,那 么在计算该表达式的值时,应先执行优先级高的运算 ,再依次执行优先级低的运算。 x | y & b+c 该表达式就等价于: x |(y&(b+c)) ③ 表中同一行上的运算符有相同的优先级。如果 它们出现在同一个表达式中,则按结合性的顺序进行 计算。 a % b*c 等价于: (a%b)*c ④ 在分析C源程序或者编写C程序时,要注意运算 符的作用和其运算分量的个数。 3.3.2 运算符嵌套 leap = year%4= =0&&year%100 !=0 || year% 400= =0 3.3.3 表达式计算顺序 在很多情况下,C语言中表达式的计算顺序是不确 定的。 应注意以下几点: ① 掌握C语言中对各个运算符的优先级和结合性 的规定。特别要注意区分具有同样外形而语义不同的 运算符(如+、-、*、&等)。 ② C语言中有5个运算符保证计算顺序严格从左到 右进行,它们是:&&、||、?:、,和函数调用运算符 ()。 ③ 在一个表达式中出现多个有不同优先级的运算 符时,可以通过加圆括号的方式改变运算顺序,例如 : (a+b)*(c/d) ④ 为了强调某部分是作为一个“整体”参与运算, 可以引用“中间变量”,把“整体”的值赋给这个变量, 然后由这个变量参与有关运算。例如: t = a+b; x = t*c; 例3-8:分析下面程序运行的结果。 #include void main() { int x,y=1,z; x=((9+6)%5>=9%5+6%5)?1:0; printf(“ x=%d\n“,x); y +=z=x+3; printf(“ y=%d\t z=%d\n“,y,z); x=y=z=1; ――x&&++y || z++; printf(“ x=%d\t y=%d\t z=%d\n“,x,y,z); } 运行结果如下: x=0 y=4 z=3 x=0 y=1 z=2

展开阅读全文

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。