2018-01-17 创建人:Ruo_Xiao
开发环境:VS2010
邮箱:xclsoftware@163.com
一、分类
算术操作符、移位操作符、位操作符、
赋值、单目操作符、关系操作符、
逻辑操作符、条件操作符、逗号操作符
二、算术操作符
+ - * / %
- 除了%外其余均适用于浮点型和整型。
- /:当两边都是整数时,结果是商,其他情况执行浮点数除法。
- %:两边只能是整数,结果是余数。
栗子:
int i = 4.0%3; //error C2296: “%”: 非法,左操作数包含“double”类型
int k = 4%3; //正确
三、移位操作符
<< >>
1、<<:在左移位中,值的最左边的几位被丢弃,右边多出来的几个空位则由0补齐。
2、>>:在右移位中,值的最右边的几位被丢弃,左边多出来的几个空位有如下
两种情况:
(1)逻辑移位:左边移入的位由0填充。
(2)算术移位:左边移入的位由原来符号位决定,若为1,则全部填充1,若为0,则全部填充0。
具体采取上述哪种情况,由编译器决定。
栗子:
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int i1 = -123;
int i2 = i1>>3;
int i3 = 123;
int i4 = i3>>3;
cout<<"i1 = "<<i1<<endl;
cout<<"i2 = "<<i2<<endl;
cout<<endl;
cout<<"i3 = "<<i3<<endl;
cout<<"i4 = "<<i4<<endl;
cin.get();
return 0;
}
结果如下:
解释:
(1)补码计算过程:
-123:1111 1011 -> 1000 0100 -> 1000 0101。
123:0111 1011 -> 0111 1011 -> 0111 1011
(2)右移三位,两种结果,如下:
-123:
A、逻辑移位:0001 0000。
B、算术移位:1111 0000。
123:
A、逻辑移位:0000 1111。
B、算术移位:0000 1111。
(3)上述结果在计算机中都是补码,那么其原码对应的十进制是什么呢?计算如下:
-123:
A、0001 0000 -> 0001 0000 -> 0001 0000 -> 16。
B、1111 0000 -> 1110 1111 -> 1001 0000 -> -16。
123:
A、0000 1111 -> 0000 1111 -> 0000 1111 -> 15。
B、0000 1111 -> 0000 1111 -> 0000 1111 -> 15。
答案揭晓:对于VS2010,数值右移,在左边,是按照符号位进行填充的,即:算术移位。
四、位操作符
& -> AND
| -> OR
^ -> XOR(异或,相同为0,不相同为1)
五、赋值
= 结合性从右向左
复合赋值符:+= -= <<= 等。
这里需要注意:
a = a + 1;
a += 1;
上述两个表达式结果都是一样的,但是更推荐后者,原因如下:
b*(a+3) = b*(a+3) + 10;
b*(a+3) += 10;
大家明白了吧,有上述栗子可知,复合赋值比普通赋值的优点如下:
(1)增强源码的可读性和易维护性。
(2)后者表达式b*(a+3)只计算1次,前者计算2次,提高代码执行效率。