c语言基础教程第三章运算符和表达式免费版.docx
- 文档编号:23207428
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:33
- 大小:94.96KB
c语言基础教程第三章运算符和表达式免费版.docx
《c语言基础教程第三章运算符和表达式免费版.docx》由会员分享,可在线阅读,更多相关《c语言基础教程第三章运算符和表达式免费版.docx(33页珍藏版)》请在冰豆网上搜索。
c语言基础教程第三章运算符和表达式免费版
完全免费版
第三章 运算符和表达式
3.1.1算术运算符
算术运算符分单目运算符和双目运算符两种。
单目运算符只有求负数运算符
(一),又称为负值运算符。
与它对应的正值运算符(+)很少使用,这里不详述。
负值运算符是用来改变一个操作数的正或负号的。
在一个正数前加一负值运算符后,则该数变为负数;在一个负数前加一负值运算符后,则该数变为正数。
双目运算符有如下5种:
+:
加法运算符。
如,3+9十I1.
一:
减法运算符加,7一40
*:
乘法运算符。
如,5*3
/除法运算符。
如,18/6
%:
求余运算符。
如,12%5.
这5种运算符都要求有两个操作数,故称双目运算符。
说明:
(1)除求余运算符只适用整型数运算外,其余运算符可以作整数运算,也可以作浮点数运符。
加、减法运算符还可作字符运算。
(2)两个整数相除其结果为整数。
例如,8/5结果为1.小数部分舍去。
如果两个操作数有一个为负数时,则舍入方法与机器有关。
多数机器是取整后向零靠拢。
例如,8/5取值为1.8/5取值为一1,但也有的机器例外。
(3)求余运算符的功能是舍掉两整数相除的商,只取其余数。
两个整数能够整除,其余数为0,例如,8%4的值为0,当两个整数中有一个为负数,其余数如何处理呢?
请记住,按照下述规则处理:
余数=被除数-除数*商
这里,被除数是指%左边的操作数,除数是指%右边的操作数,商是两整数相除的整数商。
例如,-8/5的余数应该是
—5*(-1)=-3
而8/一5的余数应该是
8-(-5)*(-1)=3
(4)一个字符常量可与整数作加减运算。
下列表达式是合法的:
C+'A'-'a'
其中,c是一个字符变量,该表达式将c所存放的大写字母变成了小写字母。
3.1.2增1减1运算符
增1和减1运算符也是属于算术运算符,这是两个单目运算符,这两个运算符具有副作用,因此,单独列出讲解。
增1运算符的作用是使被作用的变量值增1,而使其表达式的值或增1或不增1,这取决于前缀作用还是后缀作用。
前缀作用时,则表达式值增1;后缀作用时,则表达式值不增to所谓前缀作用是指运算符作用在变量之前,后缀作用是指运算符作用在变量之后。
增1运算符是由两个加号组成的:
十+.例如:
inti=5
执行++i后,i的值为6,而+十1的值也是6,执行i十+后,i的值为6,而i++的值为5.
可见,增1运算符实际上有两个作用,除了可以产生一个表达式的值之外,还会改变其变量本身的值。
一般的运算符只有产生表达式的值这一功能,而没有改变变量值的功能。
例如,求负数运算符,在下述表达式中。
没有改变变量本身的值:
inti=5;
一i的值为一5,而i的值仍然是5e
我们说增1运算符有"副作用"是指这种运算符除了产生表达式值的作用之外,还有一个改变变量的作用,后一个作用不是所有运算符都有的,故称为"副作用".在C语言中,具有副作用的运算符除了增1减1运算符外,还有赋值运算符。
总结一下增1运算符功能上的特点如下:
增1运算符作用于一变量,可使该变量的值增i;如果前缀作用于变量,则其表达式的值为原变量值增1;如果后缀作用于变量,则其表达式的值为原变量的值。
同样的道理,减1运算符功能上的特点如下:
减1运算符作用于一变量,可使该变量的值减1;如果前缀作用于变量,则其表达式的值为原变量值减1;如果后缀作用于变量,则其表达式的值为原变量的值。
例如:
inta=2;
执行一一a后,a变量的值为l,一一a表达式的值为1;执行a一一后,a量的值为1,a一表达式的值为2.
在学习和掌握增1和减1运算符时,应该搞清楚下列的两个不同。
.变量值和表达式值的不同;
.前缀作用和后缀作用的不同。
在使用增1和减1运算符时应该注意:
它只能作用于变量,而不能作用于常量和表达式,例如,下列写法都是不合法的:
inta=5,b=3;
+十一a,(a+b)++,++10,一一(a*b)等
关于增1减1运算符组成表达式计算问题在本章后面还会讲述。
3.1.3关系运算符
关系运算符都是双目运算符,其功能是用来对两个操作数的大小进行比较的。
C语言提供了如下6种关系运算符:
<:
小于运算符。
如,a
<=:
小于等于运算符。
如,c<=5
>:
大于运算符。
如,b>c-
>=:
大于等于运算符,如,b>=o
==等于运算符。
如,c==b
!
=;不等于运算符。
如c!
=l0
在这6个运算符中,前4个优先级相同,后两个优先级相同。
关系运算符组成的关系表达式的值是逻辑值。
即是真或假。
例如,a>5的值要么是真,要么是假,取决于a的值。
如果a值为8,则a>5为真。
在C语言中没有逻辑类型的量,规定"真"用1表示,"假"用。
表示。
于是,a>5值为1.这里的1就是数字1.例如,下述表达式是合法的;
(a>5)十2
其值为3,
这是C语言不同于其他语言之处。
关系运算符常用来组成关系表达式作为某些语句的条件,故称条件表达式。
关于等于运算符是由两个代数式中的等号组成的,有时容易写成一个等号与代数式中的等号相混。
在C语言中,一个等号是赋值运算符,它与等于运算符截然不同,请一定注意其区别。
3.1.4逻辑运算符
逻辑运算符是用来对操作数进行逻辑操作的。
C语言提供了如下的逻辑运算符。
单目的逻辑运算符:
!
表示逻辑求反或逻辑非,如,!
(a+b)q
双目的逻辑运算符:
乙衣表示逻辑与,即对两个操作数进行逻辑求与。
例如,a$$b||}}表示逻辑或,即对两个操作数进行逻辑求或。
关于逻辑求反是对真求反后为假,对假求反后为真。
关于逻辑求与是指两个操作数中只有都是真时,求与后才是真。
否则,求与后为假。
关于逻辑求或是指两个操作数中只要有一个为真时,求或后就为真。
只有两个都是假时,求或后才是假。
操作数的真与假是这样规定的:
非零为真,零为假。
逻辑运算结果的真与假是这样规定的:
真用1表示,假用0示。
例如,
inta=5,b=0;
!
a的值为0,因为a为真,则!
a为假。
a&.b的值为。
,因为b为假,则a&:
.b为假。
a!
||的值为1.因为a为真,则a||b为真。
!
a|b的值为0,因为!
a和b都为假,则!
a||b为假。
3.1.5位操作运算符
位操作运算符又分为逻辑位运算符和移位运算符两类。
1.逻辑位运算符
逻辑位运算符是一种对操作数按其二进制位进行逻辑操作的运算符。
它包含如下几种:
单目运算符:
~表示按位求反运算符。
如一5.
双日运算符:
冬表示按位与运算符。
如5&3
}表示按位或运算符。
如,3|5
一表示按位异或运算符。
如,;5`7
进行逻辑位操作时,先将操作数化为二进制数,然后按下列运算规则进行。
按位求反是将操作数中各个二进制位逐位求反,即1求反后为0,0求反后为1
按位与是将两个操作数各二进制位从低位到高位对齐,再将每位的两个二进制数相与,除了两个"i"为1外。
其余为。
按位或是将两个操作数各二进制位从低位到高位对齐。
再将每位的两个二进制数相或,除了两个。
"为0外,其余为1,
按位异或又称按位加,忽略进位,先将两个操作数各二进制位从低位到高位对齐,再将每位的两个二进制数相加,不考虑进位,即两位相同的二进制数,则为0,两位是不同的二进制数。
则为1.
例如,假定仅按sf}--进制长度计算。
且不考虑符号位:
~5为242
5&3为1
5'3为r7
5'3为6
逻辑位运算符组成的表达式的值是劝。
术值。
它与逻辑表达式不同。
2.移位运算符
移位运算符是用来将某个操作数向某个方向(或左,或右)移动所指定的二进制位数。
移位
运算符是双目运算符,它包含有左移和右移两种
>>表示右移运算符。
如,a>>2.
<<表示左移运算符。
如,b<<3
移位运算符是对某个操作数进位移位操作,由于所移动是二进制位数,需将待移位的操作数化为二进制数,然后按指定的移动位数或向右移动或向左移动。
右移运算时,移去的位被弃掉,左端补。
或补符号位。
根据机器不同而定,有的机器是补0,机器是补符号位,所谓符号位是指机器所存放的一个字的最高位。
左移运算时。
移去的位被丢掉,右端一律}补0
例如,
4>>2的值为1
4<<2的值位16
移位运算符组成的表达式检值也拾算术值。
可以通过下述例子,上机试一下该机器右位移运算时时补0还时补号位。
计算表达式->>2的值,如果是-1,则右移运算时补符号位,否则是补0。
3.1.6赋值运算符
赋值运算符是用来给变量斌值的。
它是双目运算符,用来将一个表达式的值送给一个变量。
C语言中,赋值运算符有一个基本的和10个复合的。
基本的赋值运算符是-.该运算符左边一般是变量或表示某个地址的表达式,称为左值,该运算符的右边一般是一个表达式,称为右值。
组合的赋值运算符包含由5个算术运算符与基本赋值运算符组成的和由5个位操作运算符与基本赋值运算符组成的,它们分别是:
+=表示加赋值运算符。
如,a+=b等价于a=a+b.
一=表示减赋值运算符。
如,a一=b等价于,a=a-b.
*=表示乘赋值运算符。
如,a*=b等价于a=a*b.
/=表示除赋值运算符。
如,a=b等价于a=a/b.
%=表示取余赋值运算符。
如,a%=b等价于a=a%b.
&=表示位与赋值运算符。
如,a&=b等价于a=a&b.
|=表示位或赋值运算符。
如,a|=b等价于a=a|b.
-=表示位异或赋值运算符。
如,a>>=b等价于a=>>b.
>>=表示右移赋值运算符。
如,a>>=b等价于a=a>>b.
<<=表示左移赋值运算符。
如,a<
复合赋值运算符所表示的表达式不仅比一般赋值运算符表示的表达式简练,而且所生成的目标代码也较少。
因此,C语言程序中尽量采用复合赋值运算符的形式表示。
赋值运算符是一种有副作用的运算符。
该运算符可产生一个表达式的值,同时又将改变其变量的值。
例如,
x=5;
它将表示如下两层意思:
一是使变量的值被改变为5,不论变量x原值是多少,执行上述语句后,x的值为5.二是表达式x=5的值也是5,可将该表达式的值赋给另一个变量,也可以将该表达式的值输出显示。
因此,下面的语句是正确的,并能验证x=5表达式的值是5
intx=3.m;
printff("%d\n",x=5),
m=x=8;
printf("%d\n",m),
第一个printf()语句输出为5,它表明表达式x=5的值为5.这时如果输出二的值也应该是5.第二个printf()语句输出为8,它表明m的值是S,而m的值是通过表达式x=8的值获得的。
因此,在C语言的程序中,连续赋值是有意义的。
表达式m=x=8;是先将8赋值给x,再将x=8表达式的值8赋给m所以,m获值为8.在使用赋值运算符时应注意该运算符的副作用。
3.1.7其他运算符
除了上述的6类运算符外,所有其他运算符在这里讲述。
1.三目运算符
三目运算符是由两个字符组成,要求三个操作数的一种特殊运算符,该运算符的功能类似于条件语句,故称条件运算符。
其格式如下所示:
dl?
d2:
d3
其中,dl,d2和d3是二个表达式。
?
:
是二目运算符。
该运算符的功能是:
先计算d1,如果dl的值是非。
,则整个表达式的值是d2的值;如果dl的值是。
,则整个表达式的值是d3的值。
关于整个表达式的类型将是d2和d3这两个表达式中类型高的一个。
2.逗号运葬符
在C语言中,逗号(,)既可作分隔符又可作运算符。
逗号运算符是用来把若干个表达式连接起来合成一个表达式,逗号表达式的值则是组成它的最后一个表达式的值,它的类型也是最后一个表达式的类型,逗号运算符较少使用,它只是用在只允许出现一个表达式的地方而又要同时出现几个表达式时,用它将几个表达式连起来组成,一个逗号表达式。
3.强制类型运茸符
该运算符是用来强制一个表达式的类型的。
该运算符是由一对圆括号括起一个类型说明符组成的,它作用于某个表达式的前面,便将这个表达式的类型强制成圆括号中所指定的类型。
例如,
(int)(a=b+c=I.5)
将表达式a}b+c*1.5的类型强制成为int型。
这种强制是暂时的,它不改变表达式中各变量原来的类型。
对于同一个表达式可根据需要强制成这种类型或那种类型,不论表达式的类型比强制成的类型高还是低,都是可以的。
强制类型运算符是单目运算符'在程序中经常使用。
4.sizeof运算符
该运算符用来求得某种类型或某个变量所占内存的字节数。
它是一个单目运算符,作用于类型说明符或变敏名的左边,并用圆括号将作用的类型说明符或变量名括起来。
其格式如下所示:
sireof<类型说明符,或(变量名))
例如:
inta,b[10]
使用sizeof(a)将获得变量a在机器内存中所占的字节数。
一般的16位微机,表达式sizeof(a)的值应该为2,即与sizeof(int)的值是等价的同样},SLZeOf(b)的值为20,它是数组b的所有元素所占的总内存字节数。
通过下述语句便可求得你所使用的机器不同类型变量所占的内存字节数:
printf("%d,'%d,%d, %d,\n",sizeof(char),aizeof(int),sizeof(float).sizcof(double)):
该语句输出显示的结果将告诉我们。
char型,ant型,float型和double型变量所占内存的字节数加果你所使用的是一般的if位微机,其结果为1,2,4,8.
5.元素/成员运算符
C语言中提供了三个表示数组元素和结构/联合成员的运算符。
(})下标运算符:
〔」是用来表示数组元索的。
〔」内将给出标识该数组元素位置的下标表达式,该表达式是一个常量表达式。
(2)结构/联合变量成员运算符:
·是用来表示结构/联合变量的成员的。
详见本书"结构联合枚举"一章。
(3)指向结构/联合变量指针成员运算符:
一>是用来表示指向结构/联合变量的指针成员的。
详见本书"结构联合枚举"一章。
6.取地址运算将
该运算符是用来获取某个变量的地址值的,它是一个单目运算符。
其格式如下所示:
&}<变量名)
其中,乙是取地址运算符。
该运算符可作用在变量名、数组元素名、结构变量名前,不能作用在常量、表达式和数组名前。
因为常量和表达式是没有内存地址的,数组名本身已是一个地址值了。
例如,
inta,b;
&表示取变量a的地址值,即是变量a在内存中被分配的内存地址值,只有被存放在内存中的变量才可取地址值,同样,&.b表示取变量b的内存地址值。
7.取内容运算符
该运算符是用来间接地获取某变量的值。
假定,一个指针p指向某个变量a,并且变量a在内存中存放的值为5.将该运算符作用于p(即、P)则表示取P的内容,而p的内容是它所指向的变量a的值。
因此,取内容运算符是用来获取被该运算符所作用的指针所指向的变量的值。
该运算符实际上是通过指针来间接取变量的值。
该运算符是一个单目运算符,运算符的符号是,.例如,
inta=5,*p=&a;
*p的值是5.即指针p的内容是5,也就是指针p所指向的变量a的值。
关于取内容运算符和前面的取地址运算符将在本书"指针"一章中还会详述。
8.括号运算籍
该运算符是用来改变原来的优先级的。
括号运算符的优先级最高。
括号运算符可以包含使用(即嵌套),即在括号内还可以使用括号,在出现多重括号时,应该先作最内层括号,按从里向外的顺序进行。
在实际编程中,经常使用括号来改变优先级,即在某些表达式中要求先作优先级低的运算符,这时只好用括号来改变优先级。
例如,在下述表达式中,
c=getchar()!
=EOF
其中,c是一个int型变量,可用来存放字符。
getchar()是前面曾介绍过的从键盘上获得一个字符的函数,EOF是一个符号常量,其值被定义为一1.该表达式要求从键盘上获取一个字符后先放在变量c中保存,然后再判断该字符是否不等于一1.一般的字符是不会等于一1的。
作为终止键盘输入的符号((ctrl)+z+回车)才是一1.而上述表达式按运算符的优先级是先将获取的字符判断是否是一1,然后将判断结果赋给变量c.显然,上述表达式与要求不一致,为此加括号改变优先级后将与要求相符:
(c=getchar())!
=EOF
括号在c语言程序中是经常使用的。
也是干一分重要的。
以上共讲述了`k个运算符的功能及使用时应注意的事项。
3.2.1运算符的优先级
C语言中运算符的优先级共分15级。
记住每种运算符的优先级在计算表达式的值或书写表达式语句中是十分重要的。
下面讲述如何记住优先级的方法。
记优先级妙诀如下:
去掉一个最高级,再去掉一个最低级。
一、二、三和赋值。
说明:
最高级是括号和元素及成员(共4个).最低级是逗号((1个).一是单目运算符(共9个),二是双目运算符(共1F}个),三是三目运算符(1个),赋值是赋值运算符(11个).接着。
在双目运算符中。
还包含有}0个优先级。
这10个优先级记忆方法是:
算术2.关系2,逻辑2;移位1插在前,逻辑位3插在后。
说明:
"算术2}表明算术运算符又分二个优先级,、,/和%在前,+,-在后。
"关系2"表明它在算术运算符后边有二类优先级,<,<=,>,>=在前,+,-在后。
"逻辑2"表明它在关系运算符之后。
又分2个优先级,&&在前,||在后。
"移位1插在前"表明移位运算符是1个优先级插在算。
术和关系之间,即>>夕和<<."逻辑位3插在后"表明逻辑位运算符有3个优先级,&在前,-在中,|在后,它们插在关系和逻辑之间,这样,15种优先级的顺序就记住了。
3.2.2运算符的结合性
前面讲述了运算符的15种优先级,优先级高的先作运算,优先级低的后作运算。
那么,有若干个优先级相同的运算符组成的表达式,先作哪个呢?
这就要看结合性了。
结合性分两类,一类是从左至右,一般运算符都属于一类;另一类是从右至左,只有少数的3类运算符属于这一类,它们是:
单目、三目和赋值。
可见。
只要记住了三类从右至左结合性的运算符就可以了,因为其余都是从左至右。
优先级和结合性虽然都是用来判断表达式的计算顺序的,但是它们却是两个完全不同的概念,优先级有15类,结合性只有z种:
判断表达式计算顺序时,先按优先级高的先计算,优先级低的后计算,当优先级相同时再按结合性,或从左至右顺序计算,或从右至左顺序计算。
例如,
a一b,c、d;
这个表达式计算顺序,光按优先级应先作b}.,然后,剩h的运算符"一"和"十"的优先级相同,再按自左至右的结合性顺序、先作减法运算、后作加法运算。
从这里可以进一步看出记忆优先级和结合性对解决计算顺序间题是何等的重要!
下面给出一张表,该表中清楚标明C语言中运算符的种类、名称、优先级和结合性。
3.3.1表达式和表达式的种类
1表达式
表达式是常量、变量、函数和运算符组合起来的有意义的式子。
下面都是合法的表达式:
++a一3
b/=4
x<=y
(rn=1)$$-n,6
a=1,b=2,c=3
X+sin,(y)
x<2?
m:
n
合法表达式经过计算后都将具有一个确定的值和类型。
下面是一些非法表达式:
5.3%2
++3+2
+十一a一b
非法表达式是没有值和类型的,在编译中系统将指出表达式是非法的。
C语言是一个多表达式语言,这意味着C语言中有种类繁多的表达式,它包含了别的语言中所没有的一些表达式,在C语言程序中表达式语句占的比例很大,关于表达式语句下一章讲述。
2.表达式的种类
这里介绍C语言中的各种表达式。
表达式的种类与运算符的种类有关,由于C语言中运算符种类多,因此,表达式种类也多。
它们是算术表达式、关系表达式、逻辑表达式、赋值表达式、条件表达式和逗号表达式。
(1)算术表达式
由算术运算符、增1减1运算符和位操作运算符组成的表达式都属于算术表达式。
算术表达式的值为整型的称为整型表达式,其值为浮点型的称为浮点型表达式。
算术表达式的类型由参与算术表达式的各操作数的类型决定的。
如果参与算术表达式的各操作数的类型都相同,则表达式的类型与操作数的类型相同,如果参与算术表达式的各操作数的类型不同,则表达式的类型由操作数中类型最高的决定。
下面通过例题来熟悉和掌握各种算术表达式的计算方法。
[例3.1}整型数运算。
main()
{
'
intx,y;
printf("Inputx,y");
ecanf("%d%d",&x,&y);
printf("x+y=%d,x一y=%d\n",x+y,x一Y);
printf("x*y=%d,x/y=%d\n",x*y,x/y)
primf("(x/y)*y+}x(mod)y=%d\n",x/y*y+x%y);
}
执行该程序后,屏幕上显示如下提示信息:
Inputx.y:
12 5
键入12,空格,5回车后,屏幕上显示如下输出信息:
x+y-.,17,x一y=7
x*y=60,x/y=2
(x/Y)*y+x(mod)y=12
这里,需要说明的是两个整数相除,结果为整数,即x/y结果为2.而x%Y的结果也为2,前者是整数商为2,后者是相除后余数为2.本例中出现的表达式都是核型的算术表达式。
[例3.2]浮点数运算。
main()
{
floata,b=B.5;
a=7.2;
a=b
printf("%f\n",n);
a/=b;
printf("%.4f\n",a);
printf("%,Ialf\n",a).
执行该程序的输出显示结果如下:
6I.I,99997
7.2Q00
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 基础教程 第三 运算 表达式 免费版