加( + ) 减( - )乘( * )除( / ) 取模( % )
算术操作符是我们日常用的最多的,也是大家最熟悉不过的。
要注意以下几点
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
移位操作符分左移和右移
<< 左移操作符
>> 右移操作符_
注:移位操作符的操作数只能是整数。而且是针对二进制补码进行移动
它的移位规则:
左边抛弃、右边补0
移位规则:
首先右移运算分两种:
1. 逻辑移位
左边用0填充,右边丢弃2. 算术移位
左边用原该值的符号位填充,右边丢弃
那计算机采用的是逻辑移位,还是算术移位呢???
正确答案是取决于编译器,不过大部分编译器的是采用算术移位,因为这样意义才大!!
先补充一些计算机存储数据的知识
在计算机中存储数据是按二进制的补码进行存储的
补码的转换公式=原码取反加一!
正数的原码反码补码是一样的!!!!!!
正数右移
负数右移
所以说,只有当右移位算术移位才有实际意义,比如我们上面把-4右移,其实就是让它除2,变成-2,而逻辑右移则将这个数变成一个非常大的正数,那它的意义何在呢? |
位操作符有:
& -------- 按位与
| --------- 按位或
^ -------- 按位异或
注:他们的操作数必须是整数。
通过一些练习题来理解它是最好不过的方法!
#include
int main()
{
int num1 = 1;
int num2 = 2;
int a=num1& num2;
int b=num1 | num2;
int c=num1^ num2;
printf("a=%d b=%d c=%d", a, c, b);
return 0;
}
有个小结论:任何数与0异或等于任何数,比如10^0=10
任何数与自己异或等于0,比如10^10=0
而且它们满足交换律,比如10^ 4 ^ 10= 10^ 10 ^4=0 ^ 4=4
至于为什么是这样,其实跟上面图的num1^num2一样的分析方法,自己可以尝试画一下图理解,有了这个结论就可以做一下下面这道面试题
曾经有一道变态面试
#include
int main()
{
int a = 10;
int b = 20;
printf("交换前a = %d b = %d\n", a, b);//
a = a ^ b; // 其实就是a=10^20,先不用算结果
b = a ^ b; //然后现在b=a^b=10^20^20,所以就变成b=10^0=10
a = a ^ b; //这里就是a= 10 ^ 20 ^ b = 10 ^ 20 ^ 10
//用交换律就等于10 ^ 10 ^ 20 = 0 ^ 20 = 20
printf("交换后a = %d b = %d\n", a, b);//这样两个数就交换过来了
return 0;
}
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
+=
–=
*=
/=
%=
>>=
<<=
&=
|=
^=
! ------------ 逻辑反操作
- ------------ 负值
+ ----------- 正值
& ------------取地址
sizeof ------操作数的类型长度(以字节为单位)
~ ------------ 对一个数的二进制按位取反
– ------------前置、后置–
++ ----------前置、后置++
* ------------ 间接访问操作符(解引用操作符)
(类型) ------ 强制类型转换
主要要注意的是前置和后置的区别
>
>=
<
<=
!= ----------- 用于测试“不相等”
== ---------- 用于测试“相等”
关系操作符比较简单,最主要的就是下面这个
警告:
在编程的过程中== 和=不小心写错,导致的错误
&& ------------ 逻辑与
|| --------------- 逻辑或
注意:
区分逻辑与和按位与
区分逻辑或和按位或
1&2----->0--------按位与
1&&2---->1-------逻辑与 两边的数为真,表达式就为真
1|2----->3---------按位或
1||2---->1----------逻辑或 其中一方为真,则表达式为真
逻辑操作符还有一个最重要的点就是‘“短路”
用一道题理解
一道360笔试题
#include
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
//程序输出的结果是什么?