•算术操作符: + 、- 、* 、/ 、% • 移位操作符: << >> • 位操作符: & | ^ • 赋值操作符: = 、+= 、 -= 、 *= 、 /= 、%= 、<<= 、>>= 、&= 、|= 、^= • 单目操作符: !、++、--、&、*、+、-、~ 、sizeof、(类型) • 关系操作符: > 、>= 、< 、<= 、 == 、 != • 逻辑操作符: && 、|| • 条件操作符: ? : • 逗号表达式: , • 下标引用: [] • 函数调用: () • 结构成员访问: . 、-> 关系操作符、条件操作符、逻辑操作符:https://blog.csdn.net/wait___wait/article/details/135269329 结构成员访问操作符:https://blog.csdn.net/wait___wait/article/details/136178916 算术操作符、赋值操作符、单目操作符:C语言之操作符1
操作符中有一些操作符和二进制及原码、反码、补码有关系。我们先了解二进制和进制转换的知识https://blog.csdn.net/wait___wait/article/details/136137220
原码、反码、补码:https://blog.csdn.net/wait___wait/article/details/136138289
当然清楚的铁铁也可以不用看啦!
>>右移操作符
<<左移操作符
注:移位操作符的操作数只能是整数
警告 :对于移位运算符,不要移动负数位,这个是标准未定义的。
例如:
int num = 10;
num>>-1; //error
移位规则:左边抛弃、右边补0
#include <stdio.h>
int main()
{
int num = 10;
int n = num<<1;
printf("n= %d\n", n);//20
printf("num= %d\n", num);//10
return 0;
}
最终结果为n ==20, num == 10。
如果想要num的值也改变,则可以使用复合赋值 num <<= 1;
从运行结果可以推出:左移一位有乘2的效果。
移位规则:首先右移运算分两种:
1.逻辑右移:左边用0填充,右边丢弃
2.算术右移:左边用原该值的符号位填充,右边丢弃
采用哪种运算规则由编译器决定,常见的编译器采用算术右移
与左移一位类似,右移一位有除2的效果,但也有例外 -1 >> 1的结果还是-1(算术右移)
#include <stdio.h>
int main()
{
int num = 10;
int n = num>>1;
printf("n= %d\n", n);
printf("num= %d\n", num);
return 0;
}
位操作符有:
注:他们的操作数必须是整数,操作的是二进制位。
按位异或通常的使用公式:
a ^ a==0 a ^ 0==a
位操作符需要与逻辑操作符进行区分:
&& //逻辑或 || //逻辑与 ! //逻辑取反
举例:
#include <stdio.h>
int main()
{
int num1 = -3;
int num2 = 5;
printf("%d\n", num1 & num2);//3
printf("%d\n", num1 | num2);//-5
printf("%d\n", num1 ^ num2);//-8
printf("%d\n", ~0);//-1
return 0;
}
分析:
我们知道数据的计算是通过它的补码进行计算的 -3的原码:10000000000000000000000000000011 -3的反码:11111111111111111111111111111100 -3的补码:11111111111111111111111111111101 5的原反补 00000000000000000000000000000101 -3 & 5的补码:00000000000000000000000000000101 由于符号位为0,所以是正数,而正数的原反补相同,因此-3 & 5的结果是3 -3 | 5、-3 ^ 5以此类推,结果为-5、-8 ~0的补码:11111111111111111111111111111111 符号位是1,负数,所得补码的原码:10000000000000000000000000000001—> -1
(不能创建临时变量(第三个变量),实现两个数的交换:https://blog.csdn.net/wait___wait/article/details/136143074)
单目操作符有这些:
!、++、--、&、*、+、-、~ 、sizeof、(类型)
单目操作符的特点是只有一个操作数,在单目操作符中只有&和*没有介绍,这2个操作符,我们放在学习指针的时候学习。单目操作符 https://blog.csdn.net/wait___wait/article/details/135242898
exp1, exp2, exp3, …expN
逗号表达式,就是用逗号隔开的多个表达式,如果表达式的结果要赋值给另一个变量,则在表达式的外面加上括号。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
//代码1
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1); //逗号表达式
c是多少?//13
//代码2
if (a = b + 1, c = a / 2, d > 0)
//代码3 冗长
a = get_val();
count_val(a);
while (a > 0)
{
//业务处理
a = get_val();
count_val(a);
}
如果使用逗号表达式,代码3可改写成:
while (a = get_val(), count_val(a), a > 0)
{
//业务处理
}
下标引用操作符是一个双目操作符,可能你会很奇怪,明明中括号里面就一个操作数,为什么是双目操作符?那我们现在就先来看看它的操作数到底是哪些。
操作数:一个数组名+一个索引值(索引值就是数组的下标)
int arr[10]; //创建数组
arr[9] = 10; //实用下标引用操作符。
[ ]的两个操作数是arr和9
接受⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数。
#include <stdio.h>
void test1()
{
printf("hehe\n");
}
void test2(const char* str)
{
printf("%s\n", str);
}
int main()
{
test1(); //这⾥的()就是作为函数调⽤操作符。
test2("hello bit."); //这⾥的()就是函数调⽤操作符。
return 0;
}
**写作不易,您的认同给与我莫大的鼓励!!!**