6.5运算符与表达式

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


练习
给定a=7,求a+=a-=a/=a*=3 解: 结合方向:从右至左 a*=3 a=a*3=7*3=21 a/=21 a= a/21= 21/21 a-=1 a=a-1=1-1=0 a+=0 a=a+0=0+0=0
结果:0
(1)a/=3 练习 : a=a/3=4/3=1 main() (2)a*=1 {int a=016; a=1*81+6*80=14 a=a*1=1*1=1 a%=6-1; a=a%(6-1)=14%5=4 (3)a+=1 printf(“%d,”,a); 4, a=a+1=1+1=2 a+=a*=a/=3; a++表达式的值取a的值为2,然后a自 printf(“%d,”,a++); 增1为3 printf(“%d”,++a);} ++a表达式的值为3+1=4
答案:4,2
(二)赋值表达式
(1)简单赋值运算符 —运算符:=,双目运算符 —优先级:较低,只高于逗号运算符 例:x=6+2等价于x=(6+2) (先计算6+2,再赋给x) —结合性: 从右至左 例:a=b=20/4等价于a=(b=20/4) 先20/4=5赋给b 再把b的值给a
(2)复合赋值运算符 在“=”左边加上其它运算符构成: 常用的 有:+=、-=、*=、/=、%= 性质同简单赋值运算符“=”
主要内容
6.1基本数据类型 6.2常量和变量 6.3数据的输入和输出 6.4类型转换 6.5运算符与表达式

6.5 运算符与表达式
几个概念:运算符、运算量(操作数)和表达式
表达式
1
+
2
运 算 量
运 算 符
运 算 量
表达式:由运算符和运算量组合而成的式子叫表达式
运算符的几个性质:
——参加运算符的运算量数目:单目,双目,三目 例:a+b中的“+”要求左右必须有数,即有2个运 算量,因此“+”叫双目运算符 ——运算符的优先级
答案:4,2,4
(三)关系表达式
—运算符:>, <, >=, <=, ==,!= —双目运算符 —优先级(1) >, <, >=, <=同一级别, (2)==,!=同一级别 (3)>, <, >=, <= 高于==,!= (4)关系运算符优先级高于赋值运算 符,低于算数运算符
例: a+b>b+c等价于(a+b)>(b+c) a=b>c等价于a=(b>c) 2+a==b-a等价于(2+a)==(b-a)
例6-6
#include <stdio.h> main() {char ch=„w‟; int a=2,b=0,c=0; float x=3.0; printf("%d", a&&b); printf("%d",a||b&&c); printf("%d",!a&&b); printf("%d",a||3+10&&2);} printf("%d",!(x==2)); printf("%d",!x==2); printf("%d\n",ch||b);
例2:c=5;d=c--; 解: c--: 先把c的值给d,d=5 c再减1:c=c-1=4
注意:

自增、自减运算符只能用于变量,不能用于常 量或表达式 例:5++和- -(x-y)都是错误的
练习1 : main() m=x=3 {int x=3,y=6,m,n; x=x+1=4 m=x++; y=y+1=7 n=++y; n=y=7 printf(“x=%d,y=%d\n”,x,y); printf(“m=%d,n=%d”,m,n);} 答案:x=4,y=7 m=3,n=7
(七)强制类型转换运算符
—运算符:(类型名),单目运算符 —优先级:优先级别高 表现形式:(类型名)(表达式)
例:
(int)(4.5)= 4
(float)(3)= 3.0
(int)4.5+6= 10
例: main() {float x=6.7; int y; y=(int)x; printf(“%f\n”,x); printf(“%d”,y); }
(2) !高于算术运算符高于关系运算符高于&&、||
—结合性:&&和||从左至右 ; !从右至左 —逻辑表达式: 用关系运算符将运算量链接起来 —逻辑表达式的值:
注意:在逻辑运算中,并不是只有1才能代表真,而 是所有非0的值都表示逻辑真,只有0表示逻辑假
(1) 逻辑非(!) !真的值为假(0) !假的值为真(1)
例:2+3×4中遵循“先乘除,后加减”,这就叫优先 级
单目运算符优先级高于双目运算符 ——运算符的结合性(若一个运算量两侧的运算符 优先级别相同时,应该优先计算的运算符) 例:1+3-2,3两端的+和-优先级相同,遵循从左至右 的结合性
(一)算术表达式
(1)算术运算符
—运算符:+(加)、-(减)、*(乘)、/(除)、 %(求余)

(2)正值、负值运算符 —运算符:+(正值)、-(负值) —优先级:优先级较高,高于算术运算符 —结合性:从右向左
例:int a=8,b=6,c=5,y; y=-a-b*c+a/c; -8-6*5+8/5=-8-30+1=-37
(3)自增(1)、自减(1)运算符
—运算符:++(自增)、- -(自减),单Βιβλιοθήκη Baidu运算符
结果:表达式的值为0,m=0,n=1
例:a=0,b=4,m=2,n=1 求执行(m=a)&&(n=b)后,m和n的值 (2)在一个或多个||相连的表达式中,计算从左到右 进行计算时,若遇到运算符左边的表达式值为1,则 停止运算 结果:表达式的值为1,m=5,n=1 例:a=5,b=4,m=2,n=1 求执行(m=a)||(n=b)后,m和n的值
形式:变量
赋值运算符 表达式 左边只能是变量,不能是 常量或表达式
例:5=a和a+b+=c都是错误的
关于复合赋值运算符的表达式的求解 a+=b+5等价于a=a+(b+5) a%=4等价于a=a%4 a*=2+5等价于a=a*(2+5) 写成a=a*2+5是错误的! 练习:给定a=6,b=3,求a的值与右边表达式的值 a=a+(b+5) a的值为14,表达式的值为14 a=a%4 a的值为2,表达式的值为2 a=a*(2+5) a的值为42,表达式的值为42
A.4 B.3 C.2 答案:D D.1
(六)逗号表达式
—运算符:” ,” —优先级:优先级别最低 —结合性:从左至右 逗号表达式:用逗号运算符将若干个表达式链在 一起,组成逗号表达式 形式:表达式1,表达式2,...,表达式n 求解过程:从左到右依次计算每个表达式的值, 并将表达式n的值作为逗号表达式的 值,将表达式n的类型作为逗号表达 式的类型

例:设a,b,c都是整型变量,计算逗号表达式 “(a=2), (b=3), (c=a+b)”的值
解: (1)a=2表达式的值为2
(2)b=3表达式的值为3 (3)c=a+b表达式的值为5 所以最后一个表达式的值5作为整个表达式的 值,类型是int类型
练习1:int x=3,求“x++,x+2,x++”的值 解: (1)x++表达式的值为3,然后x=x+1=4 (2)x+2表达式的值为6(注:x本身的值没有变化)
其实用条件运算符可以实现一个双分支的选择 结构: 例:设a,b是整型变量,将a,b的最大值赋给z (1)用if语句来实现 if(a>b) z=a; else z=b; (2)用条件运算符来实现 z=(a>b)?a:b;

例:
(1)(n>0)?2.9:1等价于n>0?2.9:1
(2)a>b?a:c>d?c:d等价于a>b?a:(c>d?c:d)
结果: 0101101
例6-7写出满足要求的逻辑表达式



x 为零 关系表达式 x == 0 等价 逻辑表达式 !x x 不为零 x != 0 x x 和 y 不同时为零 !(x == 0 && y==0) x != 0 || y!=0 x || y
解 X!=0||y!=0或!( x==0&&y==0)或x||y
(2)逻辑与(&&) 6a&&b 真&&真的值为真(1) 真&&假的值为假(0) 假&&真的值为假(0) 假&&假的值为假(0) (3)逻辑或(||) a||b 真||真的值为真(1) 真||假的值为真(1) 假||真的值为真(1) 假||假的值为假(0)
特例:
(1)在一个或多个&&相连的表达式中,计算从左到右 进 行计算时,若遇到运算符左边的表达式值为0, 则停止运算
双目运算符 —优先级:*、/、%同一级别, +、-同一级别,先 乘除、后加减 —结合性: 从左至右 —+和-既可做双目运算符,也可作单目运算符
10+2和a+b 例如: -10和+10
进行算术运算时的几点注意事项: —除号两端都为整数时,结果舍掉小数取整 例如:3/2=1 1/2=0 —除号两端只要有一个为实数,结果必为实数 例如:4.0/5=0.8 4. /5=0.8 1./2.=0.5 — %:取余、取模 规定: %两端必须为整数 例如:3 % 2=1 7%8=7 100 % 4=0
练习2 : main() {int x=3,y=5; printf(“%d,%d”,x++,y--);} 答案:3,5 若printf(“%d,%d”, ++x, --y); 答案:4,4
练习3:
#include "stdio.h" main( ) { int x=3,y=3; x++; /*等价于x=x+1;*/ y--; printf("%d,%d",x,y); }
(3)x++表达式的值为4,然后x=x+1=5 所以最后一个表达式的值4作为整个表达式的值, 类型是int类型 练习2:int i,求“i=5,i++,i=i+2,i=8”的值 8
练习3:求x=(y=3,y+1)的值
4
练习4: 求a的值
a=(3+5,4*6)
a=3+5,4*6 结果:
a=24
a=8
练习1: main( ) {int a,b,c,x=10,y=9; a=(--x==y++)?- -x:++y;
b=x++;c=y; printf(“%d,%d,%d\n”,a,b,c);} A.9,9,9 B8,8,10 C.9,10,10 D.8,9,11 答案:B
练习2: k<a?k:(c?c:a) main( ) {int a=3,b=2,c=1,k=4; printf(“\n%d\n”,k<a?k:c?c:a);}
—结合性:从左至右
例如:5>2>8
关系表达式:用关系运算符将两个表达式链接起 来的式子 —关系表达式的值:真(1)和假(0)
计算这几个表达式的值: 5>2>9 „a‟<„c‟
0 1
a=1,b=2,c=3
求a+b>b+c
0
(四)逻辑表达式
—运算符: !(逻辑非)、&&(逻辑与)、||(逻辑或) —&&和||是双目运算符,!是单目运算符 —优先级 (1) !高于&&高于||
结果: 6.700000
注意: (1)类型名必须用括号括起来 (2)强制类型转换时,被转换 变量本身值不改变
6
(八)长度运算符

—运算符:sizeof,单目运算符 —优先级:优先级别高
表现形式:
sizeof(表达式)/*求表达式在内存中占的字节数*/
sizeof(数据类型表示符)/*求某种数据类型标识符
x 非0 非0 0 y 非0 0 非0 !(x==0&&y==0) 1 1 1 X!=0||y!=0 1 1 1 X||y 1 1 1
0
0
0
0
0
(五)条件表达式
—运算符:?: (三目运算符) —优先级:只高于赋值运算符 —结合性:从右至左 条件表达式:用条件运算符将三个表达式连接在 一起,就组成条件表达式 形式:表达式1 ?表达式2 :表达式3 求解过程:先计算表达式1的值,如果它的值为 非0(真),将表达式2的值作为条件表达 式的值,否则,将表达式3的值作为条件 表达式的值
—优先级:优先级较高,与负值(正值)运算符 同级,高于算术运算符 —结合性:从右向左 有以下几种形式: ++i:i先加1,然后再参与其它运算 i++:i先参与其它运算,然后再自加1 - -i:i先减1,然后再参与其它运算 i- -:i先参与其它运算,然后再自减1
例1:a=5;b=++a; 解: ++a: a先加1,a=a+1=6 再把a的值给b:b=6
相关文档
最新文档