我只相信命运是掌握在自己手中的
希望各位哥哥姐姐们留下宝贵的批评,您的建议就是我前进的动力
这里也祝各位哥哥姐姐早日到达自己的星辰大海
🚀1.操作符分类
1.算术操作符
2.移位操作符
3.位操作符
4.赋值操作符
5.单目操作符
6.关系操作符
7.逻辑操作符
8.条件操作符
9.逗号表达式
10.下标引用、函数调用和结构成员
🚀2.算术操作符
+ - * / %
1.除了%操作符以外,其他的几个操作符可以用于整数和浮点数
2.对于 / 操作符如果两个操作数都为整数,执行整数除法,而只要有浮点数,执行的就是浮点数除法。
3.% 操作符的两个操作数必须为整数,返回的是整数之后的余数。
🚀3.移位操作符
🚁3.1左移操作符
==<<==左移操作符
移位操作符实际上移动的是二进制位。
在这里为大家简单介绍一下计算机里面的二进制,八进制,十进制,十六进制
大家不要把这几种进制看的太难了,其实它们也只不过是数值的表达形式而已
比如:
整数的二进制表示形式有三种:原码、 反码、 补码
原码:将一个整数按照正负直接翻译成二进制称为原码
反码:原码符号位不变,其他位按位取反
补码:反码加1
下面对这三种形式进行以下讲解:
我们在VS中调试一个例子看一下
这里为什么是 fb ff ff ff 呢?因为:
请看下面的例子为大家讲解左移操作符:
注意:移位之后只是这个动作所得出的结果发生了变化,但是a本身是没有发生变化的,移位前a=5,移位之后a还是等于5!
以上就是左移操作符,您学废了嘛!下面请看它的兄弟友谊操作符
🚁3.2右移操作符
首先,先给大家提前说一下右移操作符的移位规则:
右移操作符分为两种:
1.逻辑右移:左边用0填充,右边丢弃
2.算术右移:左边用原该值的符号位填充,右边丢弃
右移的时候到底是采用算术右移还是逻辑右移呢?这取决于我们的编译器!
举一个简单的小例子你一下就明白了了:
🚀4.位操作符
位操作符:
& - 按位与
| - 按位或
^ - 按位异或
这里的位指的是二进制位
按位与:
按位或:
按位异或:
操作符例题:
编写代码实现,求一个整数存储在内存中的二进制中的1的个数:
int count_one(int num)
{
int i = 0;
int count = 0;
for (i = 0; i < 32; i++)
{
if (num & 1 << i)
{
count++;
}
}
return count;
}
int main()
{
int num = 0;
scanf("%d", &num);
int ret = count_one(num);
printf("%d", ret);
return 0;
}
讲解num & 1: 假设输入的数字是5,1的补码是00000000000000000000000000000001,用最后一位的1一直左移去按位与5的补码的每一位,当1与5的补码中的1按位与时,就会得到一个1,条件语句就会执行一次,count就进行++一次;
代码的优化:
int main()
{
int num = 0;
scanf("%d", &num);
int count = 0;
while (num)
{
count++;
num = num & (num - 1);
}
printf("%d", count);
return 0;
}
代码讲解
这个算法的总结:
给定变量一个数值,用这个数值 & 一个比他小1的数值,因为小1的数字的二进制中的1的个数肯定会比这个数值二进制中的1的个数少1个,这样就会消掉一个1,然后再把这个按位与的结果重新赋值给这个变量,然后再继续 & 一个小1的数字……一直循环,直到最后变为全0!
一道变态的面试题:
不能创建临时变量(第三变量),实现两个数的交换。
要想进行两个数的交换,我们第一想到的是下面这种情况:创建一个tmp变量进行交换,但是,题目要求不能创建临时变量,那么请看第二种解法:
第二种解法:
这里是先将 a + b的值附给了a等于8,然后将a - b的值赋给了b等于3,然后再将a - b的值赋给了a等于3;这样完成了交换,但是,这种交换是存在bug的,如果两个数太大,加起来超过了一个整型所表示的范围,就会产生溢出!所以我们再一次对代码进行优化!
==第三种解法:==利用按位异或进行交换
int main()
{
int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d , b=%d", a, b);
return 0;
}
异或的特点就是:绝对不会溢出,但是只能应用于整数
🚀5.赋值操作符
赋值操作符是、可以说是一个很棒而且很简单的赋值符。
int weight = 120;
weight = 90;//不满意就重新赋值
double salary = 10000.0;
salary = 20000.0
赋值操作符还可以连续使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//尽量不要这样写,这样写不易于调试
复合赋值操作符
赋值符又可以和算术操作符联合起来一起使用,比如:
!= -= *= /= %= >>= <<= &= |= ^=
🚀6.单目操作符
🛫6.1单目操作符介绍
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度
~ 对一个数的二进制按位取反
– 前置、后置–
++ 前置、后置++
* 简介访问操作符(解引用操作符)
(类型) 强制类型转换
演示代码:
sizeof()
++ 和 - -
int main()
{
//后置加加
int a = 5;
int b = a++;
printf("a=%d, b=%d\n",a,b);
//后置减减
int c = 10;
int d = c--;
printf("c=%d, d=%d\n",c,d);
//前置加加
int A = 8;
int B = ++A;
printf("A=%d, B=%d\n", A, B);
//前置减减
int C = 6;
int D = --C;
printf("C=%d, D=%d\n", C, D);
return 0;
}
前置++ 是先使用后++, 后置++是先++后使用,同理 - -也是一样
🛫6.2 sizeof和数组
下面用一段代码为大家讲解:
void test1(int arr[])
{
printf("%d\n", sizeof(arr));
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));
}
int main()
{
int arr[10] = { 0 };
char ch[10] = { 0 };
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(ch));
test1(arr);
test2(ch);
return 0;
}
讲解:
今天的文章就到此结束了,希望大家可以多多评论,给出批评,您的意见就是我进步的动力,也祝各位哥哥姐姐们早日到达自己的星辰大海!