我的C++ 第三章 运算符和表达式
2012-03-22 22:15
197 查看
第三篇:运算符和表达式
一、C++的运算符、优先级和结合性:
对常量或变量进行运算或处理的符号称为运算符,参与运算的对象称为操作数。
说明: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)逻辑运算符:(分为关系运算符和逻辑运算符)
① 关于优先级:
!(非)、算数运算符、关系运算符、&&和||、赋值运算符
高------------------------------------------------------->低
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
一、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 | 左→右 |
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
相关文章推荐
- 含括号和四则运算符的简单表达式的计算【c++ 50 lines】
- C++中运算符和表达式的总结
- 第三章 Shell表达式与运算符
- 第三章 表达式和运算符笔记摘要
- 第三章 运算符和表达式 java
- C++逗号运算符与逗号表达式
- C++逗号运算符与逗号表达式
- java 第三章 运算符,表达式和语句
- Javascript权威指南——第二章词法结构,第三章类型、值和变量,第四章表达式和运算符,第五章语句
- C++零基础(三):运算符与表达式
- C++ Programming Language - 运算符与表达式
- C++_利用栈进行运算符表达式的运算
- C++ 表达式和运算符
- 让我们来看一看C++ 三.表达式与运算符
- 用《叩响C#之门》复习C#基础知识 第三章 运算符和表达式
- [C++]算术运算符和表达式
- java 第三章 运算符,表达式和语句
- C++ 之 第四课 C++中的运算符、表达式
- C++表达式与运算符
- C++学习日记(运算符和表达式)