目录
一、算术操作符
二、移位操作符
1、左移操作符
2、右移操作符
三、位操作符
四、赋值操作符
五、单目操作符
六、关系操作符
七、逻辑操作符
八、条件操作符
九、逗号表达式
十、下表引用、函数调用和结构成员
十一、表达式求值
1、算数转换
2、操作符的属性
一、算术操作符
1、% 两边的操作数只能为整数,并且返回的是整除之后的余数。而其他的几个操作符可以作用于整数和浮点数。
2、对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
二、移位操作符
位移操作符移动的是二进制,操作数只能是整数,整数在内存中存储的是二进制的补码,位移操作符移动的是存储在内存中的补码。
1、左移操作符
移位规则是:左边抛弃,右边补0。
练习代码如下:
2、右移操作符
右移规则运算有两种:(1)逻辑移位,左边用0填充,右边丢弃;(2)算数移位,左边用原该值的符号位填充,右边丢弃。注意:采用逻辑右移与算术右移,取决于编译器,但是大部分编译器都采用的是算术右移,此实例也是采用算术右移。
练习代码如下:
三、位操作符
& 按位与 | 按位或 ^ 按位异或
注意:他们的操作数必须是整数
int main()
{
int num1 = 1;
int num2 = 2;
num1 & num2; //按位与:有0为0,同1为1
//00000000000000000000000000000001
//00000000000000000000000000000010
//00000000000000000000000000000000
num1 | num2;//按位或:有1为1
//00000000000000000000000000000011
num1 ^ num2;//按位异或:相同为0,相异为1
//00000000000000000000000000000011
return 0;
}
下面来一道练习题:
异或是支持交换律的,比如:a^a =0,0^a =a。
接下来计算一个二进制数里面有几个1。
思路:计算机里面存储的都是二进制的补码,所以15的补码为00000000000000000000000000001111,让它与1按位与如果等于1时,说明最后一位二进制位是1,然后让a右移一位,再与1按位与,以此类推。
四、赋值操作符
赋值操作符是一个很棒的操作符,他可以让你得到一个你之前不满意的值。也就是你可以给自己重新赋值。
例如:
int weight = 120;//体重
weight = 100;
double salary = 10000.0
salary = 20000.0
还可以连续赋值,比如:
int a = 10;
int b = 0;
int c = 20;
a = b = c;
复合赋值符
int main()
{
int a = 10;
a =+ 10;
printf("%d\n",a);//20
return 0;
}
五、单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
特别注意:前置、后置++。前置++是先++后使用;后置++是先使用后++
前置、后置--。前置- -是先- -后使用;后置- -是先使用后- -。
例如:
六、关系操作符
> >= < <=
!= 用于测试“不相等”
== 用于测试“相等”
注意:这里的==是等于操作符,而上边的=是赋值操作符。
七、逻辑操作符
&& 逻辑与
| | 逻辑或
&&操作符,两边都为真,它为真。如:1 && 2 --- > 1 ,1 && 0 --->0
| |操作符,一边为真,它为真。如:1 | | 0 ---> 1
来一道360的笔试题:
解析:a1 = 0,后置++,先使用,所以这时a1为0,则a1++ && ++b1为假,所以到此结束,所以b1、c1、d1的值不变。
a2 = 0,后置++,先使用,所以这时a2为0,由于是| |,所以b2的值变为3,由于a2++
| | ++b2 为真,则d2的值不变。
八、条件操作符
exp1 ? exp2 : exp3
if (a > 5)
b = 3;
else
b = -3;
如果将上式转换成条件表达式,是什么样呢?
九、逗号表达式
exp1, exp2, exp3, ...expN
逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果。
十、下表引用、函数调用和结构成员
1、 [ ]下标引用操作符
操作数:一个数组名 + 一个索引值
2、( )函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数。
3、访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
下图是使用的方法:
十一、表达式求值
1、算数转换
如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。那么排名低的类型向排名高的类型转换。
类型依次从低到高:
int -> unsigned int -> long int -> unsigned long int -> float -> double -> long double
2、操作符的属性
复杂表达式的求值有三个影响的因素。
1.、操作符的优先级
2.、操作符的结合性
3.、是否控制求值顺序。
两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。
下面是操作符的优先级:从上到下依次递增
本文要是有不足的地方,欢迎大家在下面评论,我会在第一时间更正。