版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章要求:掌握各种运算符的使用,理解运算符的优先级、结合性和要求运算的对象数目掌握各类表达式的书写及其正确使用方法理解隐式数据类型转换和强制数据类型转换本章重点:各种运算符与表达式的使用方法本章难点:运算符的优先级与结合性。第3章运算符与表达式第3章运算符与表达式运算符概述算术运算符与算术表达式赋值运算符与赋值表达式关系运算与逻辑运算逗号运算符与逗号表达式位运算符指针变量的运算表达式中的类型转换3.1
运算符概述3.1.1 C语言运算符分类C语言中运算符和表达式数量之多,在高级语言中是少见的,正是丰富的运算符和表达式使C语言功能十分完善。这也是C语言的主要特点之一。运算符的种类C语言的运算符共有10类3.1
运算符概述学习运算符应注意的几个问题(1)运算符的功能;与运算量的关系要求运算量的个数要求运算量的类型运算符的优先级别运算符的结合性(也称结合方向)运算结果的类型单目运算双目运算三目运算++,--,&,
-+,-,*,%?
:3.1.2
优先级与结合性C语言的运算符不仅具有不同的优先级(共分为15级。1级最高,15级最低),而且还有一个特点,就是它的结合性。因此,在表达式中,各运算量参与运算的先后顺序不仅要遵守运算符优先级的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。3.1
运算符概述例:a*b/c++,--,&左右右左3.2.1
算术运算符3.2
算术运算符与算术表达式设i=53.2
算术运算符与算术表达式说明:1)当“/”被用于整数或字符时,结果取整。例如,在整数除法中,5/2结果为2,1/2的结果为0。
2)取负运算的实际效果等于用-1乘单个操作数,即任何数值前放置减号将改变其符号。3)求余(或求模运算符)“%”,取整数除法的余数,其结果等于两数相除后的余数。要求参与运算的数据必须是整型数据,(“%”不能用于float和double类型)余数的符号始终与分子的符号一致。例如,9%4=1;-9%4=-1;9%-4=1;-9%-4=-1。3.2
算术运算符与算术表达式++,--运算符为单目运算,要求运算对象只能是变量结合方向:自右向左。优先级:高于双目运算可有以下几种形式:++i
变量i自增1后再参与其它运算。i++
变量i
参与运算后,再自增1。--i
变量i自减1后再参与其它运算。i--
变量i
参与运算后,再自减1。(2)自增,自减运算符自增运算符:++自减运算符:--其功能是使变量的值自增1。其功能是使变量的值自减1。3.2
算术运算符与算术表达式例:void
main(){int
x,y;x=10;y=++x;printf(“%d,%d”,x,y);}如果将程序的第2行改为:x=10;y=x++;结果如何?关键在于区别变量是先参与运算,还是先使用变量自增(自减)程序运行后,输出结果是:11
,11第2章数据类型、运算符和表达式10注意:++,--运算符为单目运算,要求运算对象只能是变量结合方向:由右至左。-i++
不表示(-i)++
而是-(i++)优先级:
高于双目运算求(i++)+(i++)+(i++)值的问题i=3,求printf(“%d,%d”,i,i++)的输出结果求i+++j值的问题------(i++)+j贪婪原理3.2
算术运算符与算术表达式11
第2章数据类型、运算符和表达式例:#include
<stdio.h>int
main(
){int
a=1,b=2,c;c=a+++b;printf("a=%d,
b=%d,
c=%d\n",a,b,c);}#include
<stdio.h>int
main(
){int
a=1,b=2,c;c=++a+b;printf("a=%d,
b=%d,
c=%d\n",a,b,c);}输出结果为:a=2,
b=2,
c=3输出结果为:a=2,
b=2,
c=43.2
算术运算符与算术表达式3.2
算术运算符与算术表达式3.2.2
算术表达式定义:由算术运算符、括弧、内部函数及数据组成的式子需要掌握的书写原则:(1)表达式中的所有运算符和操作数必须并排书写。不能出现上下标(如x2,x2等)和数学中的分数线。a
t212注意:C中若写成:
1/2*a*t*t应写成:0.5*a*t*t结果不对或者:1.0/2*a*t*t3.2
算术运算符与算术表达式(2)在C表达式中不能省略乘号(如2ab、xy等)。(3)要注意各种运算符的优先级别,为保持运算顺序,在写C表达式时需要适当添加括号()。(4)若要用到库函数,必须按库函数要求书写,如上面表达式中的sqrt、exp、log就是库函数。库函数的书写格式是:库函数名(参数表)。(5)表达式中不能出现C语言字符集以外的字符,如β、α、δ、π等希腊字母及≤、≥、÷、≠等数学运算符号。3.3
赋值运算符和赋值表达式3.3.1
简单赋值运算符与表达式一般形式为:
变量=表达式功能:计算表达式的值再赋予左边的变量整个赋值表达式的值为:左边变量的值
请注意,只有变量才能为赋值运算的左值3.3
赋值运算符和赋值表达式例如:
x=a+bw=sin(a)+sin(b)赋值运算符的结合方向:由右至左因此a=b=c=5可理解为:a=(b=(c=5))优先级:低于条件运算符
?:,高于逗号运算符,赋值表达式:在赋值表达式的未尾加上分号,就构成为赋值语句。3.3
赋值运算符和赋值表达式说明:若赋值运算符两边的数据类型不相同,系统将自
动进行类型转换,即把赋值号右边的类型换成左边的类型。具体转换规定如下:实型赋予整型,舍去小数部分。整型赋予实型,数值不变,但将以浮点形式存放,即增加小数部分(小数部分的值为0)。字符型赋予整型,由于字符型为一个字节,整型为二个字节,故将字符的ASCII码值放到整型量的低八位中,高八位为0。整型赋予字符型,只把低八位赋予字符量。3.3
赋值运算符和赋值表达式例3-4:用程序验证不同类型变量的赋值的类型转换
int
main(){inta,b,c=322;float
x,y=3.14;char
ch1='a',ch2;a=y; x=c;
b=ch1;
ch2=c;printf("%d,%f,%d,%c",a,x,b,ch2);return
0;}3.3.2
复合赋值运算符与表达式在赋值符“=”之前加上其它二目运算符可构成复合赋值符。如:+=,-=,*=,
/=,%=,<<=,>>=,&=,
^=,
|=构成复合赋值表达式的一般形式为:变量双目运算符=表达式等效于:变量=变量运算符表达式优先级别:仅高于逗号运算符3.3
赋值运算符和赋值表达式例如:a+=5等价于a=a+5x*=y+7等价于x=x*(y+7)r%=p等价于r=r%p复合赋值符的优先级和结合方向与赋值运算符(=)相同3.4
关系运算与逻辑运算3.4.1
关系运算符与关系表达式比较两个量的运算符称为关系运算符。在C语言中有以下关系运算符:<
,<=
,>
,>=
,=
=
,!=关系运算符的优先级:>、>=、<、<=优先级相等,==、!=优先级相等,前者高于后者。算术运算符>关系运算符>赋值运算符关系表达式关系表达式的一般形式为:表达式
关系运算符
表达式关系表达式的值(运算结果)是:关系成立为“真”,不成立则为“假”C语言中用
“1”
表示“真”,
“0”
表示
“假”例如:
a+b>c-dx>3/2‘a’+1<c-i
-
5*j
=
=
k+13.4
关系运算与逻辑运算3.4
关系运算与逻辑运算表达式中也可包含关系表达式,允许出现嵌套的情况,例如:当a=5,
b=4,
c=3
时a<(b>c)a!=(c=
=b)又如:(a=3)>(b=5)由于3>5不成立,故其值为0。又如:当a=5,
b=4
时a+=3<b3.4
关系运算与逻辑运算3.4.2
逻辑运算符与逻辑表达式C语言中提供了三种逻辑运算符!
非运算
&&
与运算
||
或运算运算符&&和
或运算符||
均为双目运算符,具有左结合性。非运算符!为单目运算符,具有右结合性。(1)逻辑运算符优先级表示如下:!
>
&&
>
||而且:&&,||
低于关系运算符!高于算术运算符(高)!(非)算术运算符关系运算符
&&和||赋值运算符(低)3.4
关系运算与逻辑运算按照运算符的优先顺序可以得出:a>b
&&
c>d!b=
=c||d<aa+b>c
&&
x+y<b(a>b)
&&
(c>d)((!b)=
=c)||(d<a)((a+b)>c) &&
((x+y)<b)(2)逻辑运算的值(运算结果):逻辑运算的值也为“真”和“假”两种,用“1”和“0”来表示。第4章控制结构24(3)逻辑运算的运算量:逻辑运算的运算量分为两种:
“真”----非零的值都认为是真的
“假”----零值都认为是假的例如:!35>3
&&
3-1<1
||
03为真,则!3为假,结果为05>3为真,3为真,结果为1-1<1为真,0为假,结果为13.4
关系运算与逻辑运算3.4
关系运算与逻辑运算(4)关于逻辑运算的说明表达式
a
&&
b
&&
c
的求解过程只有a为真,才判别b的值;只有a和b均为真,才判别c的值。只要a为假,不再判别b和c的值,直接求得表达式的值为假。3.4
关系运算与逻辑运算表达式a
||b||
c
的求解过程只要a为真,就不再判别b和c的值,直接求得表达式的值为真。只有a为假,才判别b的值;只有a和b均为假时,才判别c的值。3.4
关系运算与逻辑运算例.
分析下面程序的运行结果。int
main(){
int
x=5,y=9,k=1,a;a=x++||y++&&k++;printf("a=%d,
x=%d,
y=%d,
k=%d\n",a,x,y,k);return
0;}程序运行结果如下:a=1,
x=6,
y=9,
k=13.4
关系运算与逻辑运算分析:语句“a=x++||y++&&k++;”的执行过程是先求“=”右边的值,即计算表达式“x++||y++&&k++”的值,系统从左到右进行扫描,x=5,x++是先取x的值(即5,运算后x的值增加1)进行“||”运行,因为不管其右边的值是什么,其结果都是成立的,即整个表达式的值为1,C系统就不再计算“||”右边表达式“y++&&k++”,所以y的值,k的值不变。思考:如果x的初值为0,程序的运行结果如何?第2章数据类型、运算符和表达式29根据所给条件,写出下列各题的输出结果。1.
若int a
,
b
;
unsigned
int w=5
;求:(1)
表达式w+=-2中的w值。(2)
表达式a+=a-=(b=4)*(a=3)中的a
和b值。a=-18,
b=4w=3表达式综合练习设float
x=2.5,y=4.7;int
a=7;表达式x+a%3*(int)(x+y)%2/4值为
2.5
。设int
x=17,
y=5;
执行语句x%=x++/--y后x的值
2
。第2章数据类型、运算符和表达式30表达式综合练习设
int
b=5;求解赋值表达式a=5+(b+=6)
后表达式值、a、b的值依次是
16/16/11。求解赋值表达式a=(b=10)%(c=6)后表达式值、a、b、c的值依次是
4/4/10/6
。求解逗号表达式x=a=3,6*a后表达式值、x、a的值依次是
18/3/3
。第2章数据类型、运算符和表达式31若字符变量ch的值为大写字母,则重新赋值为对应的小写字母
ch+=32
。int类型变量a、b均为两位的正整数,写出判断变量a的个位数等于变量b的十位数、变量b的个位数等于变量a的十位数的逻辑表达式a%10==b/10
&&
b%10==a/10。表达式综合练习第2章数据类型、运算符和表达式32按照要求写出下列C的表达式数学式
(x+1)
e
2
x
所对应的C算术表达式
。将double类型变量x的整数部分与y的小数部分相加的算术表达式
。将float类型变量y四舍五入至小数点后3位的表达式
。为变量s赋值:取变量x的符号,取变量y的绝对值
。表达式综合练习第4章控制结构33。(1)判断变量a、b是否绝对值相等而符号相反的逻辑表达式为
fabs(a)==fabs(b)
&&
a*b<0
。(2)判断变量a、b中必有且只有一个为0的逻辑表达式为
(a==0
&&
b!=0)||
(a!=0
&&
b==0)。(3)
若s=’d’,执行语句s=(s>=’a’&&s<=’z’)?s-32:s;后,字符变量s的值为‘D’
。a、b是字符变量,已知a的值为大写字母、b的值为小写字母,写出判断a、b是否为同一字母(不区分大小写)的逻辑表达式
a+32==b
。int类型变量a、b均为两位正整数,写出判断a的个位数等于b的十位数、b的个位数等于a的十位数的逻辑表达式练
习(a%10
==
b/10)
&&
(b%10
==
a/10)条件“-5≤x≤3”所对应的C逻辑表达式
。a、b是字符变量,已知a的值为大写字母、b的值为小写字母,写出判断a、b是否为同一字母(不区分大小写)的逻辑表达式
a+32==b
或b-21==a
。34
第4章控制结构int
a=7,
b=6,
c=5;
表达式
(a+b)>(c*c)&&b==c||c>b值为
0
。设int
a=3,
b=5,
c=7;
表达式a>c||c>b!=0&&c==b+a值为
0
。判断变量a、b中必有且只有一个为0的逻辑表达式
。(9)表达式(5==5==5)的值为
。0练
习3.5
逗号运算符和逗号表达式在C语言中逗号“,”也是一种运算符,称为逗号运算符。其功能是把两个表达式连接起来组成一个表达式,称为逗号
表达式。逗号表达式的一般形式为:表达式1,表达式2,…,表达式n求值过程是分别求表达式1、表达式2…表达式n的值,并以最后一个表达式n的值作为整个逗号表达式的值。3.5
逗号运算符和逗号表达式例:int
main(
){int
a=2,b=4,c=6,x,y,z;y=(x=a+b),(b+c);
z=(y=(x=a+b),(b+c));printf("y=%d,x=%d,z=%d",y,x,z);return
0;}结果:y=6,x=6,z=10第2章数据类型、运算符和表达式37有关逗号表达式的说明:逗号运算符优先级最低。程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。并不是在所有出现逗号的地方都组成逗号表达式,如在变量声明中或函数参数表中的逗号只是用作各变量之间的间隔符。3.5
逗号运算符和逗号表达式3.6
位运算符前面的各种运算都是以字节作为最基本位进行的。但在很多系统程序中常要求在位(bit)一级进行运算或处理。所谓位运算是指按二进制位进行的运算。C语言提供了位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。C语言提供了6种位运算符,它们的运算规则如教材P47表2-5所示。3.6
位运算符第2章数据类型、运算符和表达式391.按位与(&)格式:x&y规则:对应位均为1时才为1,否则为0:9&5=1。例如,9&5可写算式如下:00001001
(9的二进制补码)& 00000101
(5的二进制补码)00000001
(1的二进制补码)主要用途:清零。方法是与一个各位都为零的数值按位与,结果为零。取一个数x中某些指定位。方法是找一个数,此数的各位是这样取值的:对应x数要取各位,该数对应位为1,其余位为零。3.6
位运算符2.按位或(|)格式:x|y规则:对应位均为0时才为0,否则为1:3|9=11。例如,3|9=11:0011|
1001────1011主要用途:将1个数的某(些)位置1,其余各位不变。3.6
位运算符按位异或(^)格式:x^y规则:对应位相同时为0,不同时为1:3^9=10。主要用途:使1个数的某些位翻转(即原来为1的位变为0,为0的变为1),其余各位不变。按位取反(~)格式:~x规则:各位翻转,原来为1的位变成0,原来为0的位变成1。3.6
位运算符按位左移(<<)格式:x<<位数规则:使操作数的各位左移,低位补0,高位溢出:5<<2=20。按位右移(>>) 格式:x>>位数规则:使操作数的各位右移,移出的低位舍弃;高位:对无符号数和有符号的正数,补0;有符号数中的负数,取决于所使用的系统:补0的称为“逻辑右移”,补1的称为“算术右移”。例如,20>>2=5。3.6
位运算符7.位运算符与赋值运算符组成复合运算符除按位取反运算符(~)外,其他位运算符都可与赋值运算符组成复合位赋值运算符。它们是:&=,|=,>>=,<<=,∧=。例如,a&=b等价于a=a&b
,a|=b等价于a=a|b,a>>=b等价于a=a>>b。例编程取一个整数a从右端开始的4~7位。如0000000011011001,取其右端4~7位为1101。先使a右移4位,使要取出的几位移到最右端,a>>4设置一个低4位全为1,其余为0的数x将两者进行&运算第2章数据类型、运算符和表达式44int
main(){
unsigned
a,b,x,y;printf("Enter
a
number=?\n");scanf("%o",&a);/*
输入1个八进制整数给a
*/b=a>>4;/*
将a右移4位*/x=~
(~0<<4);/*间接构造1个低4位为1、其余各位为0的整数*/y=b
&
x;printf("%o\n%o\n",a,y);/*
按八进制数输出a和y
*/return
0;}3.6
位运算符第2章数据类型、运算符和表达式45说 明:x、y和“位数”等操作数,都只能是整型或字符型数据。除按位取反为单目运算符外,其余均为双目运算符。参与运算时,操作数x和y,都必须首先转换成二进制形式,然后再执行相应的按位运算。例如,5<<2=20
:0101
→010100;20>>2=5
:10100→00101。3.6
位运算符3.7
指针变量的运算其格式是:例如:*p=5;*指针变量名/*
给指针变量p指向的变量赋值5
*/printf("%d",*p);/*
打印输出指针变量指向的变量的值*/*是单目运算符,其结合性为自右至左。注意:指针运算符“*”和指针变量说明中的指针说明符“*”不同。例如:int
a=3,x,*p;
/*
a,x为整型,*p的基准类型为整型*/…p=&a;
/*
指针变量p取得了整型变量a的地址*/x=*p;
/*
将指针变量p所指向的变量a的值赋给变量x
*/指针运算符取地址运算符&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 腹外疝病人的护理教学课件
- 张家口硕佳新能源有限公司介绍企业发展分析报告模板
- 2026年餐饮管理与企业运营考试模拟试卷及答案详解
- 2026年个人破产法模拟试题(含答案)
- 2026年高中生物细胞结构与功能模拟试题(含答案)
- 2026年十八项医疗核心制度培训考试题库试题及答案详解
- 2026年融合服务模拟题及答案详解
- 2026年临床三基理论考试模拟题及答案详解
- 药品销售知识试题及答案详解
- 2026年洛阳市汝阳县事业单位考试模拟题模拟题及答案详解
- 2026年中国电信应届生校园招聘笔试真题(含详细答案解析)
- 2026年中国联通网络技术岗校园招聘笔试题及答案
- 2026年高考北京卷物理高考真题(解析版)
- 2027年山西大同市高职单招职业技能考试题库【有一套】附答案详解
- 前程无忧国企招聘笔试题库(含答案)
- 2024年全国统一高考数学试卷(理科)(甲卷)
- 中国肘关节置换术指南(2026版)
- 医疗美容行业服务与质量控制手册
- 通信工程项目施工方案与技术措施
- (更新)脊柱手术患者脑脊液渗漏护理专家共识(2024版)课件
- 21ZJ111 变形缝建筑构造
评论
0/150
提交评论