C语言之操作符(详解)

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 = 0printf("%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

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

4U247

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值