一、操作符分类
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
二、算数操作符
+ - * / %
三、移位操作符
<< 左移操作符:左边丢弃,右边补0
>> 右移操作符:分为两种:1.逻辑移位 左边用0补充,右边丢弃
2.算数移位 左边用该原值符号填充,右边丢弃
注:移位操作符的操作数只能是整数
四、位操作符
1.& 按二级制位与
比如:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
int a = 3;
int b = -5;
int c = a & b;
printf("c=%d\n", c);
return 0;
}
在上述代码中,c的结果是3,怎么得来的呢?
先写出a(3)和b(-5)的补码
00000000000000000000000000000011 3的补码
10000000000000000000000000000101 -5的原码
11111111111111111111111111111010 -5的反码
11111111111111111111111111111011 -5的补码
然后看3的补码和-5的补码:
11111111111111111111111111111011 -5的补码
00000000000000000000000000000011 3的补码
进行按位与,如果有0,就是0;如果同时为1,才为1,结果如下:
00000000000000000000000000000011 补码 ,放内存里放的是补码,正数的正反补码一样,所以结果为3
2.| 按二级制位或
同上,写出a(3)和b(-5)的补码
11111111111111111111111111111011 -5的补码
00000000000000000000000000000011 3的补码
进行按位或,如果有1,则为1;同时为0,才为0
11111111111111111111111111111011 这是补码
11111111111111111111111111111010 这是反码
1000000000000000000000000000101 这是原码,结果为-5
3.^ 按二级制位异或
同上,写出a(3)和b(-5)的补码
11111111111111111111111111111011 -5的补码
00000000000000000000000000000011 3的补码
进行按位异或,相同为0,相异为1
11111111111111111111111111111000 这是补码
11111111111111111111111111110111 这是反码
10000000000000001000000000001000 这是源码 结果为-8
一道面试题,不能创建临时变量(第三个变量),实现两个数的交换
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
int a = 2;
int b = 3;
printf("交换前:a=%d,b=%d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("交换后:a=%d,b=%d\n", a, b);
return 0;
}
五、赋值操作符
=
复合赋值符
+= a=a+5 a+=5
-=
*=
...
六、单目操作符
单目操作符只有一个操作数
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置后置--
++ 前置后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
七、关系操作符
>
>=
<
<=
!= 测试不相等
== 测试相等
两个字符串比较相等应该用strcmp库函数比较
八、逻辑操作符
&& 逻辑与 左边为假,右边就不用算了
|| 逻辑或 左边为真,右边就不用算了
一道面试题:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
//360面试题
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
//i=a++||++b||d++;
printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);
return 0;
}
结果为什么是1,2,3,4呢?不懂的可以私信我哦!!!
九、条件操作符(三目操作符)
表达式1?表达式2:表达式3
真前假后,表达式为真,算表达式2;表达式为假,算表达式3
练习题:
1.
if(a>5)
b=3;
else
b=-3;
转换成表达式是什么样的?
(a>5)?(a=3):(a=-3);
b=(a>5?3:5);
2.使用条件表达式实现找两个数的最大值
int max=(a>b?a:b);
十、逗号表达式
exp1,exp2,exp3,...expN
逗号表达式,就是用逗号隔开的多个表达式
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
十一、下标引用、函数调用和结构成员
1.[ ]下标引用操作符
操作数:一个数组名+一个索引值
2.( )函数调用操作符
3.访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名