C++语言中运算符和表达式数量之多,在高级语言中是少见的。正是丰富的运算符和表达式使C++语言功能十分完善。这也是C++语言的主要特点之一。
C++语言的运算符不仅具有不同的优先级,而且还有一个特点,就是它的结合性。在表达式中,各运算符参与运算的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的制约,以便确定是自左向右进行运算还是自右向左进行运算。这种结合性是其他高级语言的运算符所没有的,因此也增加了C++语言的复杂性。
这篇文章内容较多,我的感冒还没好,因此我要分几天来码这篇文章。
C++语言的运算符可以分为以下几类:
算术运算符
用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(–)共七种。
关系运算符
用于比较运算。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种。
逻辑运算符
用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
位操作运算符
参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
赋值运算符
用于赋值运算,分为简单赋值运算(=)、复合算术运算(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
条件运算符
这是一个三目运算符,用于条件求值(?:)
。
逗号运算符
用于把若干表达式组合成一个表达式(,)。
指针运算符
用于取内容(*)和取地址(&)两种运算。
求字节数运算符
用于计算数据类型所占据的字节数(sizeof)。
特殊运算符
有括号()、下标[]、成员(->,.)等几种。
C++语言的运算符大致就是以上所列的,部分运算符我们在前面的文章中已经学过也用到过,接下来就把几个主要的运算符做个详细介绍:
一、 算数运算符
- 模运算符
求余的运算符"%"也成为模运算符,是双目运算符,两个操作数都是整形数。a%b的值就是a除以b的余数,5%2余数位1。其操作对象只能是整型数,而其他四种运算符对int、float、double、char都适用。
- 除法运算符
C++语言的除法运算符有一些特殊之处,即如果a、b是两个整数类型的变量或常量,那么a/b的值是a除以b的商。例如,5/2的值是2,而不是2.5,而5.0/2或5/2.0的值是2.5。
- 自增自减运算符
自增、自减运算符用来对一个操作数进行加1或减1运算,其结果仍然赋予该操作数,而且参加运算的操作数必须是变量,而不能是常量或表达式。
- 自增运算符。例如,x++表示在使用x之后,使x的值加1,即x=x+1;++x表示使用x之前,先使x的值加1,即x=x+1。
- 自减运算符。例如,x–表示在使用x之后,使x的值减1,即x=x-1;–x表示使用x之前,先使x的值减1,即x=x-1。
- 复合算术赋值
例如,a+=1,相当于a=a+1;a+=b,相当于a=a+b。
二、关系运算符
关系运算符用于数值的大小比较。包括大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)和不等于(!=)六种,它们都是双目运算符。
关系运算符运算的结果是整型,值只有两种:0或1,0代表关系不成立,1代表关系成立。
三、逻辑运算符
C++语言中提供了三种逻辑运算符:与运算(&&)、或运算(||)、非运算(!)。与运算符(&&)和或运算符(||)均为双目运算符,具有左结合性。非运算符(!)为单目运算符,具有右结合性。逻辑运算符和其他运算符优先级的关系可表示如下:
按照运算符的优先符可以得出:
- a>b&&c>d等价于(a>b)&&(c>d)
- !b==c||d<a等价于((!b)==c)||(d<a)
- a+b>c&&x+y<b等价于((a+b)>c)&&((x+y)<b)
逻辑运算符的值也为“真”和“假”两种,用“1”和“0”来表示。其求值规则如下:
- 与运算&&参与运算的两个量都为真,结果就为真,否则为假。例如:5>0&&4>2,由于5>0为真,4>2也为真,相与的结果也为真。
- 或运算||参与运算的两个量只要有一个为真,结果就为真;两个量都为假时,结果为假。例如:5>0||5>8,由于5>0为真,相或的结果也就为真。
- 非运算!参与运算量为真时,结果为假;参与运算量为假时,结果为真。例如:!(5>0)的结果为假。
虽然C++编译在给出逻辑运算值时,以“1”代表“真”,“0”代表“假”。但反过来在判断一个量为“真”还是“假”时,以“0”代表“假”,以非“0”的数值作为“真”。例如:由于5和3均为非“0”,因此5&&3的值为“真”,即为“1”。又如:5||0的值为“真”,即为1。
四、位运算符
C++语言提供了6种位运算符,如下表所示:
运算符 | 含义 | 说明 | 例子 |
---|---|---|---|
& | 按位与 | 把参与运算的两个数对应的二进制位相与,只有对应的二进制均为1时,结果的对应位才为1,否则为0。 | 9&5中9可以写成(00001001),5可以写成(00000101),那么9&5的运算结果为00000001,输出结果是1。 |
| | 按位或 | 把参与运算的两个数对应的二进制位相或,也就是只要对应的两个二进制位有一个为1时,其结果就为1。 | 9|5相当于00001001\00000101,运算结果是00001101,输出结果是13。 |
^ | 按位异或 | 把参与运算的两个数对应的二进制位异或,也就是只要对应的两个二进制位有一个位1时,其结果就为1. | 1^1=0,1^0,0^0=0,0^1=1。9^5相当于00001001^,运算结果是00001100,输出结果是12。 |
~ | 取反 | 把运算数的各个二进制位按位求反。 | ~9相当于~(00001001),运作结果为11110110。 |
<< | 左移 | 把“<<”左边的运算数的各二进制位向左移若干位,“<<”右边的数是指定移动的位数,高位丢弃,低位补0。 | a<<4指把a的各二进位向左移动4位,如a=00000011(十进制为3),左移4位后为00110000(十进制为48)。 |
>> | 右移 | 把“>>”左边的运算数的各二进制位向右移若干位,“>>”右边的数是指定移动的位数。 | 设a=15,a>>2表示把00001111右移为00000011(十进制为3)。 |
需要说明的是,对于有符号数,在右移时,符号位将随同移动。当操作数为正数时,最高位为0,而为负数时,最高位为1。最高位是补0或补1取决于编译系统的规定。
五、运算的简写
在C++语言中,有一些运算符可以简写,如下表所示:
简写 | 含义 | 简写 | 含义 |
---|---|---|---|
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=a<<b |
a%=b | a=a%b | a>>=b | a=a>>b |
算数运算符、关系运算符、逻辑运算符和赋值运算符的优先级从高到低的顺序为:算数运算符>关系运算符>逻辑运算符>赋值运算符。
关系运算符的结合性为:自左向右。
根据以上优先级和结合性,计算出以下表达式的结果(假设a=3,b=2,c=1)
表达式 | 结果 |
---|---|
a>b | 表达式为真,所以表达式的值为1 |
(a>b)==c | 表达式为真,所以表达式的值为1 |
b+c<a | 表达式为假,所以表达式的值为0 |
d=a>b | a>b为真,所以d的值为1 |
f=a>b>c | a>b为真,结果为1,1>c为假,所以f为0 |
六、常用库函数
函数名 | 格式 | 功能说明 | 例子 |
---|---|---|---|
绝对值函数 | abs(x) | 求一个数x的绝对值 | abs(-5)=5 |
自然数指数函数 | esp(x) | 求实数x的自然指数:e的x次方 | exp(1)=2.718282 |
向下取整 | floor(x) | 求不大于实数x的最大整数 | floor(3.14)=3 |
向上取整 | ceil(x) | 求不小于实数x的最小整数 | ceil(3.14)=4 |
自然对数函数 | log(x) | 求实数x的自然数对数 | log(1)=0 |
指数函数 | pow(x,y) | 计算x的y次方,结果为双精度实数 | pow(2,3)=8 |
随机函数 | rand() | 产生0到RAND-MAX之间的随机整数 | |
平方根值函数 | sqrt(x) | 求实数x的平方根 | sqrt(25)=5 |
这篇文章到这就结束了,实在不好意思,脱了好几天了。