操作符的分类
按用途分类
算术操作符
+ - * \ %
- 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数
- 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法
- % 操作符的两个操作数必须为整数。返回的是整除之后的余数
移位操作符
<< 左移操作符
>> 右移操作符
-
左移操作符 移位规则:
左边抛弃、右边补0 -
右移操作符 移位规则:
首先右移运算分两种:- 逻辑移位 左边用0填充,右边丢弃
- 算术移位 左边用原该值的符号位填充,右边丢弃
-
对于移位运算符,不要移动负数位,这个是标准未定义的
位操作符
位操作符有:
& 按位与
| 按位或
^ 按位异或
注:他们的操作数必须是整数
赋值操作符
赋值符
=
复合赋值符
+= -= *= /= %=
>>= <<= &= |= ^=
这些运算符都可以写成复合的效果
关系操作符
关系操作符
>
>=
<
<=
!=
==
注意:在编程的过程中== 和=不小心写错,易导致错误
逻辑操作符
&& 逻辑与
|| 逻辑或
条件操作符
exp1 ? exp2 : exp3
逗号操作符
exp1 , exp2 , exp3
逗号操作符,就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
下标引用、函数调用和结构成员
[ ] 下标引用操作符
操作数:一个数组名 + 一个索引值
( ) 函数调用操作符
接受一个或者多个操作数:第一个操作数是函数名,剩余的操作数就是传递给函数的参数
按操作变量数目分类
按照参与运算的变量数目,可把操作符分为单目、双目、三目运算符。
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
双目操作符
双目操作符即对两个变量进行操作
算术操作符 + - * \ %
关系运算符 < <= > >= == !=
位操作符 & ^ |
逻辑操作符 && ||
赋值运算符 = += -= *= /= %= &= ^= |= <<= >>=
逗号运算符 ,
三目操作符
exp1 ? exp2 : exp3 (条件操作符)
按优先级分类
操作符的优先级分为15级,1级到15级优先级逐次降低,优先级较高的先进行运算:
1级(左结合) () 圆括号 []下标操作符 ->指向结构体成员操作符 .结构体成员操作符
2级(右结合) !逻辑非操作符 ~按位取反操作符 ++前缀增量操作符 --前缀减量操作符 +正号操作符 -负号操作符 (类型)类型转换运算符 *指针运算符 &地址运算符 sizeof长度运算符
3级(左结合) *乘法操作符 /除法操作符 %取余操作符
4级(左结合) +加法操作符 -减法操作符
5级(左结合) <<左移操作符 >>右移操作符
6级(左结合) <、<=、>、>=关系操作符
7级(左结合) ==等于操作符 !=不等于操作符
8级(左结合) &按位与操作符
9级(左结合) ^按位异或操作符
10级(左结合) |按位或操作符
11级(左结合) &&逻辑与操作符
12级(左结合) ||逻辑或操作符
13级(右结合) ? :条件操作符
14级(右结合) = += -= *= /= %= &= ^= |= <<= >>=赋值操作符
15级(左结合) ,逗号操作符
操作符的运用
& 按位与
-
按位与可用于一些简易算法
例:编写代码实现:求一个整数存储在内存中的二进制中1的个数#include <stdio.h> int main() { int num = -1; int i = 0; int count = 0;//计数 while(num) { count++; num = num&(num-1); } printf("二进制中1的个数 = %d\n",count); return 0; }
+ +和- -操作符用法
-
关于自加自减的一般用法
//前置++和-- #include <stdio.h> int main() { int a = 10; int x = ++a; //先对a进行自增,然后对使用a,也就是表达式的值是a自增之后的值。x为11。 int y = --a; //先对a进行自减,然后对使用a,也就是表达式的值是a自减之后的值。y为10; return 0; } //后置++和-- #include <stdio.h> int main() { int a = 10; int x = a++; //先对a先使用,再增加,这样x的值是10;之后a变成11; int y = a--; //先对a先使用,再自减,这样y的值是11;之后a变成10; return 0; }
^ 按位异或
-
按位异或实现两个数交换
#include <stdio.h> int main() { int a = 10; int b = 20; a = a^b; b = a^b; a = a^b; printf("a = %d b = %d\n", a, b); return 0; }
编者按
从上面的各种分类不难看出,对于数目繁多且规则冗杂的操作符,C语言时常被人诟病,却也正是因为它提供的各项功能,赋予了C语言独特的价值,在表达式的计算中被用于更为广泛的领域。