好久不见,各位阅卷者。我是答卷人
想了很久还是想分享一下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;
}
这里放一下自测题,如果一看到就有感觉了,那就很厉害了。如果你是挣扎着做出的,那恭喜你,你一定印象很深刻了。
好了其他的放下篇文章吧,感谢您的阅读!