操作符
文章目录
操作符分类
一、基本运算符
1、算数运算符
+ - / * %
对于+ - * /不多赘述,注意/的被除数不为零即可,
对于%
叫做求模运算也叫取余
求模运算符只能用于整数不能用于浮点数*
整数包括正数和负数,得数的正负取决于%号前边的数
最重要的是不要用浮点数进行求模运算。
求模运算用途比较多,比如说求一个数的个位十位百位,
123%10就得到个位3,也可以用欧几里得算法求一个最大公约数(辗转相除法),学会这个算法会对求模运算符有一个比较好的理解
2、赋值
对于赋值运算符,要先了解左值和右值
左值可修改的左值是算数表达式左侧的值
右值是指能赋值给可修改左值的值,且本身不可以为左值
= -= += /= *= %=
了解左值和右值后,就可以更好的理解赋值了。
赋值运算=是把一个右值赋值给可修改的左值
+= -= *= /= %= 是一种省略的写法
+=就是先进行加法再赋值
例如:
a +=1等价与a = a + 1
-= /= *= %=等都是一个道理
二、逻辑操作符
逻辑操作符包括&&和||和!逻辑与逻辑或逻辑非
&&逻辑与
逻辑与是全真才为真
也就是
1 && 1 =1
1 && 0 = 0
0 && 0= 0
||逻辑或
逻辑或是有真则真
也就是
1 || 1 = 1
1 || 0 = 1
0 || 0 = 0
!逻辑非
逻辑非是对象为真操作后为假,对象为假操作后为真
也就是
!1 == 0
!0 == 0
三、移位操作符
包含: >>和<<两种
是对二进制进行操作的
按位左移<<
规则:左边抛弃右边补0
例如:
a=10,二进制表示就是
00000000000000000000000000001010
a<<1
得到
00000000000000000000000000010100
a = 20
按位右移>>
分为两种
1、逻辑右移:左边用0填充,右边丢弃
2、算数右移:左边用原该值的符号位填充,右边丢弃
一般是第二种右移
由于负数的补码是对原码取反+1
符号位负数为1,正数为0
a = -1
原码:10000000000000000000000000000001
反码:1111111111111111111111111111111111110
补码:1111111111111111111111111111111111111
a>>1
得到:1111111111111111111111111111111111111
注意不可以进行负数操作
四、位操作符
分为三种&|^~按位与按位或按位异或
&按位与
与前边的逻辑与一样,全一为一,但是对二进制操作
例如a = 1 , b = 2
a为00000000000000000000000000000001
b为00000000000000000000000000000010
得00000000000000000000000000000000
|按位或
与逻辑或一样,有一则一,对二进制操作
例如a = 1 , b = 2
a为00000000000000000000000000000001
b为00000000000000000000000000000010
得00000000000000000000000000000011
按位异或
二进制位相同则为0,不同为1
例如a = 1 , b = 2
a为00000000000000000000000000000001
b为00000000000000000000000000000010
得00000000000000000000000000000011
五、单目操作符
有++ - - sizeof &(取地址)*强制类型转换
++递增运算符
有两种方式出现方式
1、++在前
例如++a就代表先递增后用
2、++在后
例如a++是先用后递增
- -递减运算符
跟++一样
有两种方式出现方式
1、- -在前
例如- - a就代表先递减后用
2、- -在后
例如a - -是先用后递减
sizeof
计算变量在内存的所占空间大小,单位是字节
例如:
int a = sizeof(arr)/sizeof(arr[0]);
用于求数组长度
&取地址
用于指针的操作,取出某一个变量的地址
*解引用操作符
用于储存一个变量的指针
int * a = &b;
就是把b变量的地址取出放到a变量中
()强制转换
(type_name) expression
例如
float a = 12.0;
(int) a 就是把float的转换为int类型
除了强制转换,编译器还可以自动转换类型,当进行不同类型的运算时会进行类型转换
short和char进行混合运算时会转化为int类型,正如下图
从较小类型转化 为较大类型运算
在赋值表达式语句中,计算的最终结果会被转换成被赋值变量的类型
例如这道题,表达式右侧为int类型,3/2结果应该是1.5,截断为2,x= 2.5截断为2 ,相加得到y=3,由于y是double类型,最终的结果就是double类型的,得到y=3.0
由于以上的机制会造成类型升级或降级
六、关系操作符
关系操作符有> < >= <= == !=
需要注意的是 ==是等于!=是不等于
其中==容易和=(赋值)搞错
七、逗号表达式
表达式,表达式,……
就是逗号表达式
表达式从左到右进行,表达式的最终值与最右边的值相等
例如
int a = 1,b = 2;
c= (a++,b+=a ,++b)
得到c=5
八、条件操作符
也就是exp1:exp2?exp3
与if else语句一样
相当于
if(exp1)
exp2;
else
exp3;
如果表达式1正确,执行表达式2,否则执行表达式3
操作符优先级
上边的表格就包含了基本的优先级关系,对于一些容易引起误会的公式,尽量用()包住,可以大大增强代码的可读性