- 我这篇文章有很多不足之处,后期我会慢慢完善,如有错误还望各位大佬们指正,谢谢了。
- 这篇博客借鉴了许多这链接里面的内容,链接里那个作者写的十分全面,而且还写了很多自己的总结,建议大家可以直接跳过我去浏览链接 里的这篇文章。
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);
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",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;
}
2,操作符优先级
级别(由高到低) 操作符(使用空格分隔) 结合性 1 () [] -> . 由左向右 2 ! ~ ++ – + - * (type) sizeof 由右向左 3 * / % 由左向右 4 + - 由左向右 5 << >> 由左向右 6 < <= > >= 由左向右 7 == != 由左向右 8 & 由左向右 9 ^ 由左向右 10 | 由左向右 11 && 由左向右 12 || 由左向右 13 ?: 由右向左 14 = += -= *= /= %= &= ^= |= <<= >>= 由右向左 15 , 由左向右
|