第三篇:运算符和表达式
一、C++的运算符、优先级和结合性:
对常量或变量进行运算或处理的符号称为运算符,参与运算的对象称为操作数。
优先级 |
运算符 |
功能 |
用法:(标识符代表运算对象) |
结合性 |
1 |
:: |
全局域 |
::name |
左→右 |
类域 |
class::name | |||
名字空间域 |
| |||
2
2 |
. |
成员访问 |
object.member |
左→右 |
—> |
成员访问 |
pointer—>member |
左→右 | |
( )
|
括号 |
(expr) |
左→右 | |
函数调用 |
name(expr_list) | |||
类型构造 |
type(expr_list) | |||
[ ] |
数组下标 |
variable[expr] |
左→右 | |
++ |
后置递增 |
variable++ |
左→右 | |
—— |
后置递减 |
variable-- |
左→右 | |
typied |
类型ID |
typied(type) |
左→右
| |
运行时类型ID |
typied(expr) | |||
const_cast |
类型转换 |
const_cast<type>(expr) |
左→右 | |
dynamic_cast |
类型转换 |
dynamic_cast<type>(expr) |
左→右 | |
reinterpret_cast |
类型转换 |
reinterpret_cast<type>(expr) |
左→右 | |
static_cast |
类型转换 |
static_cast<type>(expr) |
左→右 | |
3 |
sizeof |
对象大小 |
sizeof expr |
右→左 |
类型大小 |
sizeof(typied) | |||
++ |
前置递增 |
++variable |
右→左 | |
—— |
前置递减 |
--variable |
右→左 | |
~ |
按位取反 |
~expr |
右→左 | |
! |
逻辑非 |
!expr |
右→左 | |
+ |
单目正 |
+expr |
右→左 | |
- |
单目负 |
-expr |
右→左 | |
* |
间接引用 |
*pointer |
右→左 | |
& |
取地址 |
&variable |
右→左 | |
new
|
分配对象 |
new type |
右→左 | |
分配并初始化对象 |
new type(expr_list) |
右→左 | ||
分配数组 |
new type[ ] |
右→左 | ||
delete |
释放对象 |
delete pointer |
右→左 | |
释放数组 |
delete [ ] pointer |
右→左 | ||
(type)或type() |
强制类型转换 |
(type)expr或type(expr) |
右→左 | |
4 |
—>* |
间接访问指针指向的类成员 |
pointer—>*pointer_to_member |
左→右 |
.* |
直接访问指针指向的类成员 |
object.*pointer_to_pointer |
左→右 | |
5 |
* |
乘 |
expr*expr |
左→右 |
/ |
除 |
expr/expr |
左→右 | |
% |
求余/求模 |
expr%expr |
左→右 | |
6 |
+ |
加 |
expr+expr |
左→右 |
— |
减 |
expr-expr |
左→右 | |
7 |
<< |
按位左移 |
expr<<expr |
左→右 |
>> |
按位右移 |
Expr>>expr |
左→右 | |
8 |
< <= > >= |
比较大小 |
expr operator expr |
左→右 |
9 |
== != |
比较是否相等 |
expr operator expr |
左→右 |
10 |
& |
按位与 |
expr & expr |
左→右 |
11 |
^ |
按位异或 |
expr ^r expr |
左→右 |
12 |
| |
按位或 |
expr | expr |
左→右 |
13 |
&& |
逻辑与 |
expr && expr |
左→右 |
14 |
|| |
逻辑或 |
expr || expr |
左→右 |
15 |
?: |
条件运算 |
expr ?expr: expr |
右→左 |
16 |
= |
赋值 |
variable=eexpr |
右→左 |
+=—= *= /= %= <<= >>= &= |= ^= |
复合赋值 |
variable opterator expr |
右→左 | |
17 |
throw |
抛出异常 |
throw expr |
右→左 |
18 |
, |
逗号 |
expr,expr |
左→右 |
说明:1、优先级和结合性决定运算中的优先关系。
2、序号越小,优先级越高。
3、运算符的结合性决定优先级相等的运算符组合在一起时的运算次序,同一优先级的运算符有相同的结合性。
Eg. ((a+b)+c)-d //先算a+b,再算加c,最后减d
-(++a) //先算++a,再取相反数(加符号)
4、根据操作数的个数不同,运算符分为单目(一元)、双目(二元)、三目(三元)运算符。
三目运算符只有条件运算符 ?:
二、基本运算符和表达式:
表达式就是由运算符、操作数及标点符号组成的、能得到一个值的式子。
本篇介绍算术运算符、关系运算符、逻辑运算符、位运算。
1、 算术运算:
(1)算数运算有: + (加)、—(减)、*(乘)、
/(除)、 %(求余)
(2)运算符的重载:相同的运算符对应不同的操作数执行的运算有差异
(3)“/”:① 当两个操作数均为整数时,所执行的运算为整除,结果为整数。
Eg. 5/4 结果为:1
② 只有一个操作数为实数,则两个操作数均转化为double型。“/”称为普通的除,结果是实数。Eg. 5/4.0 结果为:1.25
“%”:称为求余运算符,也称为求模,就是求两个相
除后的余数,所以两个操作数必须均为整数。
如果两个整数中有负数,则结果符号和被除数
相同。Eg. 6%3 结果为:0
6%7 结果为:6
7%6 结果为:1
-7%6 结果为:-1
7%-6 结果为:1
-7%-6 结果为:-1
(4) 当表达式中的每个变量都有确定的值时才能进行表
达式求值
(5) 数据溢出问题:运算结果超出对应数据类型的表示范围(但计算机不会提示出错,所以要注意检查程序)
2、赋值运算:
(1)赋值:是将数据存放到变量所标识的存储单元的操作。如果该单元中已有值,赋值操作则以新值取代旧值。
(2)引用:从某个存储单元中取出数据的操作。引用不
影响内存单元中的值,可多次引用。常量只能引用,不能赋值。
(3)赋值号不是等号,它具有方向性,即将赋值号右边的送到左边变量所标识的内存单元中。左值:必须放在内存中可以访问且可以合法修改值的存储单元中。右值:可以是常量、变量,表达式,但必须是具体的值。
Eg.①下面的赋值运算是错的:
3.1415926=pi //左值不能为常数
x+y=z //左值不能是表达式
const int N=30;
N=40 //常变量不能被重新赋值
② a=5+6 //先计算在赋值
d=c=b=a+1 //a+1→b→c→d
(4)符合赋值运算符:
包括:+= -= *= /= %=
格式为:
变量 复合赋值运算符 表达式
它等同于
变量 =变量 运算符 表达式
例如:x+=5等同于:x=x+5
a+=3 //等效a=a+3;
a*=b-c //等效a=a*(b-c)
a-=(b+6) //等效a=a-(b+6)
3、自增、自减运算:(++和 --)
(1) 意义:使变量的当前值加1或减1后再赋值给该变量自己。
Eg. i++ //相当于i=i+1
j-- //相当于j=j-1
(2) ++和—运算符要求操作数只能是变量,不能是常量或表达式:Eg. a++ a+1
前者自身的值变了,后者没变
(3) ++与——的前置与后置:
① 对于单独的自增、自减表达式,运算符前置与后置无区别,但有其他的运算参与时
则会有区别.
②法则:运算符前置,变量先增减后引用
运算符后置,变量先引用后增减
Eg. int i==5,j=5,m,n;
m=i++; //相当于m=i,i++,结果m=5,i=6
n=++j; //相当于j++,n=j,结果n=6,j=6
4 、逻辑运算:(用于判断分析)
(1)逻辑运算符:(分为关系运算符和逻辑运算符)
关系运算符:
|
>(大于) >=(大于等于) <(小于) <=(小于等于) ==(等于) !=(不等于) |
逻辑值: | |
逻辑真:true 1或非0 逻辑假:false 0 | |||
逻辑运算符: |
!、&&、|| |
|
① 关于优先级:
!(非)、算数运算符、关系运算符、&&和||、赋值运算符
高------------------------------------------------------->低
Eg. int a=10,b=20,c=30;
float x=1.8,y=2.4;
求:a<b&&x>y||a<b-!c =?
求值顺序:
(a<b)&&(x>y)||(a<(b-(!c)))
② 逻辑表达式的求值优化:
Eg. a=2,b=0,c=3
a||b++||c-- 表达式结果为:1
表达式a的值就确定了结果 这是或运算
5 位运算:~ << >> & | ^
(1) 按位取反运算符“~”:
将操作数的每个二进制位取反,即1变为0,0变为1.
Eg. 整数a的值:10011011
~a的值: 01100100
(2) 左移运算符“<<”:
运算的一般格式:a<<n
(其中a为整数,n为一个正整数常数)
将a的二进制数依次向左移动n个二进制位,并在低位补0.移位运算不影响a本身的值,只是产生一个中间量。
Eg. 变量a的值:00000010
b=a<<3的值:00010000 (但a的值没变)
(3) 右移运算符“>>”:
运算的一般格式:a>>n
将a的二进制数依次向右移动n个二进制位,忽略移位后的小叔部分,并在高位补0.移位运算不影响a本身的值,只是产生一个中间量。
Eg. 变量a的值:00010000
a>>2的值:00000100
(4) 按位与运算符“&”:
运算规则:对应位均为1时,该位运算结果为1;否则为0.
Eg. 整型变量:a : 01001101
b: 00001111
则a&b的结果为:
a 0 1 0 0 1 1 0 1
b 0 0 0 0 1 1 1 1
----------------------------------------
a&b 0 0 0 0 1 1 0 1
(5) 按位或运算符“|”:
运算规则:只要有一个数对应的位为1,运算结果就为1;若两个数对应的位均为0,则结果为0.
Eg.整型变量:a : 01001101
b: 00001111
则a|b的结果为:
a 0 1 0 0 1 1 0 1
b 0 0 0 0 1 1 1 1
----------------------------------------
a|b 0 1 0 0 1 1 1 1
(6) 按位异或运算符“^”:
运算规则:当对应位的值不同时,该位运算结果为1;否则为0.
Eg.整型变量:a : 01001101
b: 00001111
则a^b的结果为:
a 0 1 0 0 1 1 0 1
b 0 0 0 0 1 1 1 1
----------------------------------------
a^b 0 1 0 0 0 0 1 0