细到极致的操作符知识点(1)

好久不见,各位阅卷者。我是答卷人

想了很久还是想分享一下c语言里面的操作符,这篇文章的操作符和其他不一样,就像标题所说,细到极致,别人没有的这里都有!好了话不多说,开始。

操作符主要分为: 
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员

1.算术操作符 

+    -   *   /   %

1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除
法。
3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
好了这个比较实用,注意事项就这么多。

2.移位操作符

<< 左移操作符
>> 右移操作符

那么,怎么用呢?左移操作符其实有一个移位规则:
左边抛弃、右边补0

什么意思呢?这个移位操作主要是对于二进制的整数进行的一个,平常一般不会用,一般都在按位异或或者计算2的高次幂的时候能更加高效。

如图,改变的是二进制的内存空间。

接下来看右边的右移操作符的移位规则: 

首先右移运算分两种:

1. 逻辑移位 左边用0填充,右边丢弃

2. 算术移位 左边用原该值的符号位填充,右边丢弃

接下来用图说的更加清晰一些。

虽然很难理解,但是我还是放出来,你只需要知道的是这会极大的方便程序员的位级别的运算,同时也可以进行快速乘除。至于补码那些就放在数据存储的那篇文章讲。下面是

#include <stdio.h> 
 
int main() { 
    int i = 5; // 二进制表示为 00000101 
    int j = 0x80000000; // 二进制表示为 10000000...0000 
 
    // 左移操作 
    int result1 = i << 2; // 结果为 20,二进制表示为 00010100 
 
    // 右移操作(算术右移) 
    int result2 = j >> 1; // 结果为 -1073741824,二进制表示为 1111111111111111111111111111111110000 
 
    printf("i = %d, result1 = %d\n", i, result1); 
    printf("j = %d, result2 = %d\n", j, result2); 
 
    return 0; 
} 

一个代码,可以试着运行一下,有空的话还可以去监视一下,就会豁然开朗的。

但是警告 对于移位运算符,不要移动负数位,这个是标准未定义的。 例如:
int num = 10;
num>>-1;//error  这里就会报错。

3.位操作符

位操作符有:
& //按位与

int a = 1100; 
int b = 1010; 
int result = a & b; // 结果为1000 
 


| //按位或

 int a = 1100; 
int b = 1010; 
int result = a | b; // 结果为1110 
 


^ //按位异或

 int a = 1100; 
int b = 1010; 
int result = a ^ b; // 结果为0110 
 

~ //按位取反

 int a = 1100; 
int result = ~a; // 结果为0011 
 


注:他们的操作数必须是整数。

这里就有一个非常变态的面试题了

不能创建临时变量(第三个变量),实现两个数的交换。

用到的就是刚刚的操作符。代码我贴在下面了。这道题会开阔思路非常好。

#include <stdio.h>
int main()
{
 int a = 10;
 int b = 20;
 a = a^b;
 b = a^b;
 a = a^b;
 printf("a = %d b = %d\n", a, b);
 return 0;
}

想不到是正常的,学的越多越想不到,所以每一个部分基础都要打好,这可是一道面试题,想想有多变态吧,难倒一片。

#include <stdio.h>
int main()
{
 int num1 = 1;
 int num2 = 2;
 num1 & num2;
 num1 | num2;
 num1 ^ num2;
 return 0;
}

这里放一下自测题,如果一看到就有感觉了,那就很厉害了。如果你是挣扎着做出的,那恭喜你,你一定印象很深刻了。

好了其他的放下篇文章吧,感谢您的阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值