C语言之操作符
文章目录
1. 操作符大全
• 算术操作符:+ 、-、 *、 /、 %
• 移位操作符:>> 、 <<
• 位操作符:& 、| 、^ 、~
• 赋值操作符:= 、+= 、-= 、 =、/= 、%= 、>>= 、<<= 、&= 、|= 、^=
• 单⽬操作符: !、++、–、&、、+、-、~ 、sizeof、(类型)
• 关系操作符: > 、>= 、< 、<= 、 == 、 !=
• 逻辑操作符: && 、||
• 条件操作符: ? :
• 逗号表达式: ,
• 下标引⽤: []
• 函数调⽤: ()
下面我来介绍以下移位操作符 位操作符 逗号表达式 下标引⽤ 函数调⽤
2. 移位操作符
移位操作符分为左移和右移
其中
左移规则:左边抛弃一位,右边补零
右移分为逻辑右移和算术右移
逻辑右移:左边补零,右边抛弃一位
算术右移:左边补符号位,右边抛弃一位
在此不做过多介绍,详细请看我的另一篇博客:移位操作符详解
建议先看完我另一篇博客再来看这边的
3. 位操作符
位操作符有 & 按位与 | 按位或 ^ 按位异或 ~ 按位取反
位操作符都是以数据的补码形式计算的
一个数的原码为它的二级制数据
它的反码为原码取反,其中符号位不变(二级制中的最高位),数值位取反
补码为反码+1
TIPS:他们的操作数必须是整数
3.1 & 按位与
#include <stdio.h>
int main()
{
int num1 = -3;
int num2 = 5;
printf("%d\n", num1 & num2);
return 0;
}
在上述代码中
num1的值为-3
-3的原码为:10000000 00000000 00000000 00000011
-3的反码为:11111111 11111111 11111111 11111100
-3的补码为:11111111 11111111 11111111 11111101
num2的值为5
正整数的原码反码补码都一样
5的补码为:00000000 00000000 00000000 00000101
按位与 | 的意思是两个数的补码值都为1才为1,否则则为0
所以num1 & num2 的值为
反码为:00000000 00000000 00000000 00000101
所以num1 & num2 = 5
代码打印结果为 5
3.2 | 按位或
#include <stdio.h>
int main()
{
int num1 = -3;
int num2 = 5;
printf("%d\n", num1 | num2);
return 0;
}
还是相同的代码,只不过将按位 & 与换成了按位或 |
上述代码中
num1 = -3 num2 = 5
还是看他们的补码
-3的补码为:11111111 11111111 11111111 11111101
5的补码为:00000000 00000000 00000000 00000101
按位或 | 的意思是:两个数的值有一个为1就为1,否则则为0
所以-3 | 5 的反码值为
11111111 11111111 11111111 11111101
由于是负数,所以我们要将补码转为原码,补码取反再+1就是原码
所以原码为10000000 00000000 00000000 00000011
所以-3 | 5 = -3
代码运行结果为 -3
3.3 ^ 按位异或
#include <stdio.h>
int main()
{
int num1 = -3;
int num2 = 5;
printf("%d\n", num1 ^ num2);
return 0;
}
上述代码中
num1 = -3 num2 = 5
依然看他们的补码
-3的补码为:11111111 11111111 11111111 11111101
5的补码为:00000000 00000000 00000000 00000101
按位异或 ^ 的意思是两个数值不同则为1,相同则为0
所以-3 ^ 5 的补码为
11111111 11111111 11111111 11111000
转化为原码为
1000000 0000000 0000000 00001000
则-3 ^ 5 = -8
代码运行结果为-8
3.4 ~ 按位取反
#include <stdio.h>
int main()
{
int num = 0;
printf("%d\n", ~num);
return 0;
}
上述代码中:
num = 0
按位取反 ~的意思是如果值为1则改为0,值为0则改为1
0的原码:00000000 00000000 00000000 00000000
按位取反之后:
11111111 11111111 11111111 11111111
转换成原码:10000000 00000000 00000000 00000001
~0的值为-1
代码运行结果为 -1
4. 逗号表达式
1 exp1,exp2,exp3,...expN
逗号表达式就是用逗号隔开多个表达式
逗号表达式,从左到右执行,整个表达式取最后一个表达式的值
#include <stdio.h>
int main()
{
int ret = 0;
int a = 15;
int b = 30;
ret = (a > b, a, b, a = a + b, b = a + b);
printf("%d\n", ret);
return 0;
}
在上述代码中
ret的结果为逗号表达式的值
a > b ,a ,b 三个表达式都没有改变a b的值,所以不影响
而a = a + b a 变成了 45
逗号表达式取最后一个表达式的值
也就是b = a + b b = 75
所以ret的结果为 75
代码运行结果:75
5. 下标引⽤[ ] 和 函数调用( )
5.1 下标引用操作符
操作数:一个数组名 + 一个索引值
int arr[10]; //创建数组
arr[9] = 10; //使用下标引用
[ ]的操作数位arr和9
5.2 函数调用操作符
接受⼀个或者多个操作数:第⼀个操作数是函数名,剩余的操作数就是传递给函数的参数
void test1()
{
printf("Hello World\n");
}
void test2(int n)
{
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d ", i);
}
}
#include <stdio.h>
int main()
{
int n = 5;
test1(); //这⾥的()就是函数调⽤操作符
test2(n); //这⾥的()就是函数调⽤操作符
return 0;
}
函数调用的操作数至少为1 例如test1()
test2(n)中函数调用操作数为test2和n