- 我这篇文章有很多不足之处,后期我会慢慢完善,如有错误还望各位大佬们指正,谢谢了。
- 这篇博客借鉴了许多这链接里面的内容,链接里那个作者写的十分全面,而且还写了很多自己的总结,建议大家可以直接跳过我去浏览链接 里的这篇文章。
https://blog.csdn.net/hitwhylz/article/details/14526569
操作符详解
1,操作符
分类:
1,算术操作符
2,移位操作符
3,位操作符
4,赋值操作符,复合赋值符
5,单目操作符,双目操作符,三目操作符
6,关系操作符
7,逻辑操作符
8,逗号表达式
9,下标引用,函数调用和结构成员
算术操作符
优先级 | 操作符 | 功能 | 结合性 | 名称 | 说明 |
---|---|---|---|---|---|
4 | + | 加 | 从左到右 | 加号 | 双目运算符 |
4 | - | 减 | 从左到右 | 减号 | 双目运算符 |
3 | * | 乘 | 从左到右 | 乘号 | 双目运算符 |
3 | / | 除 | 从左到右 | 除号 | 双目运算符 |
3 | % | 取模(求余数) | 从左到右 | 取模(余数) | 双目运算符 |
移位操作符
优先级 | 操作符 | 功能 | 结合性 | 名称 | 说明 |
---|---|---|---|---|---|
4 | << | 左移操作符 | 从左到右 | 左移操作符 | 双目运算符 |
4 | >> | 右移操作符 | 从左到右 | 右移操作符 | 双目运算符 |
- 左移,右移运算表达式的一般形式为:
x<<n(左移n位),x>>n(右移n位) - 左移运算 的规则是将x的二进制位全部向左移动n位,将左边移出的高位舍弃,右边空出的低位补0。
- 右移运算 的规则是将x的二进制位全部向右移动n位,将右边移出的低位舍弃,左边高位空出要根据量符号位的情况进行补充,对无符号数则补0,对有符号数,若为正数则补0,若为负数则补1。
- 例如: 设a = 7,则:
b=a<<2,即:b = 0000,0111 << 2 = 0001,1100 = 28
c=a>>2,即:c = 0000,0111 >> 2 = 0000,0001 = 1 - 左移的一个特殊用途是将整数值乘以2的幂,例如:左移运算表达式 1<<4的计算结果是16,右移可以用于将整数值除以2的幂
位操作符
注意:位操作符的操作数必须是整数且都以二进制形式
优先级 | 操作符 | 描述 | 功能 | 名称 | 结合性 | 说明 |
---|---|---|---|---|---|---|
8 | & | 按位与 | 两个位都为1时,结果才为1 | 按位与 | 从左到右 | 双目运算符 |
9 | I | 按位或 | 两个位都为0时,结果才为0 | 按位或 | 从左到右 | 双目运算符 |
10 | ^ | 按位异或 | 对应的二进制位相同为0相异为1 | 按位异或 | 从左到右 | 双目运算符 |
例:
赋值操作符
结合性: 简单来说,就是把右边的值赋值到左边的变量上
优先级 | 操作符 | 功能 | 结合性 | 名称 | 说明 |
---|---|---|---|---|---|
14 | = | 给变量赋值 | 从右向左 | 赋值运算符 | ---------- |
具体例子:
复合赋值符
优先级 | 操作符 | 功能 | 结合性 | 名称 | 说明 |
---|---|---|---|---|---|
14 | += | 相加之后赋值 | 从右向左 | 加后赋值 | ------- |
14 | -= | 相减之后赋值 | 从右向左 | 减后赋值 | ------- |
14 | *= | 相乘之后赋值 | 从右到左 | 乘后赋值 | ------- |
14 | /= | 相除后赋值 | 从右到左 | 除后赋值 | ------- |
14 | %= | 取模后赋值 | 从右到左 | 取模后赋值 | ------- |
14 | >>= | 右移后赋值 | 从右到左 | 右移后赋值 | ------- |
14 | <<= | 左移后赋值 | 从右到左 | 左移后赋值 | ------- |
14 | &= | 按位与后赋值 | 从右到左 | 按位与后赋值 | ------- |
14 | I= | 按位或后赋值 | 从右到左 | 按位或后赋值 | ------- |
14 | ^= | 按位异或后赋值值 | 从右到左 | 按位异或后赋值 | ------- |
使用复合操作符可以使代码变得更加简化
单目运算符
单目操作符有以下这些:
优先级 | 操作符 | 功能 | 结合性 | 名称 | 说明 |
---|---|---|---|---|---|
2 | ! | 逻辑反操作 | 从右到左 | 逻辑非运算符 | 单目运算符 |
2 | - | 取负值 | 从右到左 | 负号运算符 | 单目运算符 |
2 | & | 取地址 | 从右到左 | 取地址运算符 | 单目运算符 |
2 | sizeof | 计算变量所占内存空间大小(以字节为单位) | 从右到左 | 长度运算符 | 单目运算符 |
2 | ~ | 对一个数的二进制进行按位取反 | 从右到左 | 按位取反运算符 | 单目运算符 |
2 | - - | 可前置,可后置,数值减1 | 从右到左 | 自减运算符 | 单目运算符 |
2 | ++ | 可前置,可后置,数值加1 | 从右到左 | 自增运算符 | 单目运算符 |
2 | * | 间接访问地址中的内容 | 从右到左 | 解引用操作符 | 单目运算符 |
2 | 类型 | 强制类型转换 | 从右到左 | 强制类型转换 | 单目运算符 |
三目运算符
操作符 | 功能 | 结合性 | 名称 | 说明 |
---|---|---|---|---|
?: | 简化程序 | 从左到右 | 条件预算符 | 三目运算符 |
关系操作符
优先级 | 操作符 | 结合性 | 名称 | 说明 |
---|---|---|---|---|
6 | > | 从左到右 | 大于号 | 双目运算符 |
6 | >= | 从左到右 | 大于等于号 | 双目运算符 |
6 | <= | 从左到右 | 小于等于号 | 双目运算符 |
6 | < | 从左到右 | 小于号 | 双目运算符 |
7 | == | 从左到右 | 等于号 | 双目运算符 |
7 | != | 从左到右 | 不等于号 | 双目运算符 |
逻辑操作符
优先级 | 操作符 | 结合性 | 名称 | 说明 |
---|---|---|---|---|
11 | && | 从左到右 | 逻辑与 | 双目运算符 |
12 | II | 从左到右 | 逻辑或 | 双目运算符 |
优先级 | 操作符 | 结合性 | 名称 | 说明 |
---|---|---|---|---|
15 | , | 从左到右 | 逻辑操作符 | --------- |
下标引用,函数调用和结构成员
- 下标引用
优先级 | 操作符 | 名称 | 组成 |
---|---|---|---|
1 | [] | 下标引用操作符 | 由一个数组名+一个索引值 |
例: int arr[9] = 10;
[]的两个操作数为arr和9
- 函数调用
优先级 | 操作符 | 名称 | 组成 |
---|---|---|---|
1 | () | 函数调用操作符 | 由函数名和传递给函数的参数组成 |
例:
int calculate(int a,int b)
//这种属于函数定义
//而这里的圆括号是我们在定义函数时的语法规则
{
return a+b;
}
int main()
{
int i=0;
int j=1;
int x=calculate(i,j);
//这种就属于函数调用
//像这种函数调用符有calculate和i,j
printf("%d\n",x);
return 0
}
- 结构成员
- 这里要涉及一点结构体的知识,如果看不懂的话可以查阅一下结构体的知识即可。
. 操作符直接调用结构体中的某个成员,而——>操作符是通过结构体成员的地址直接调用结构体中的变量
例:
struct stu
{
char name[20];
int age;
char id[20];
};
int main()
{
struct stu s1 = {"张三",20,"20192245"};
struct stu *pr =&s1;
//printf("%s\n",(*pr).name);
printf("%s\n",s1.name);
printf("%d\n",s1.age);
printf("%s\n",s1.id);
printf("%s\n",pr——>name);
printf("%d\n",pr——>age);
printf("%s\n",pr——>id);
return 0;
//pr作为地址,——>的作用是访问空间pr中存储的内容
}
2,操作符优先级
级别(由高到低) 操作符(使用空格分隔) 结合性
1 () [] -> . 由左向右
2 ! ~ ++ – + - * (type) sizeof 由右向左
3 * / % 由左向右
4 + - 由左向右
5 << >> 由左向右
6 < <= > >= 由左向右
7 == != 由左向右
8 & 由左向右
9 ^ 由左向右
10 | 由左向右
11 && 由左向右
12 || 由左向右
13 ?: 由右向左
14 = += -= *= /= %= &= ^= |= <<= >>= 由右向左
15 , 由左向右