您的位置:首页 > 编程语言 > C语言/C++

我的C++ 第三章 运算符和表达式

2012-03-22 22:15 197 查看
第三篇:运算符和表达式
一、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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: