- 操作符
- 操作符的分类
- 算术操作符
不难但是有细节
+ - * / %
int a = 3/5 =0一个
小数float = 6 /5 = 1.0000000;本质是1
真的想得到小数
至少有一个数是浮点数
flaot = 6.0/5
float =%f
double =%lf
flaot a = 6.0/ 5.0
编译器会给出警告:
因为你个直接给出6.0 和5.0默认是double类型
你再用float会丢失精度
怎么改?
这种写法6666
取模 int a = 7% 3 =1
两边必须有整数
- 移位操作符
****左移原则就是补0
整形a四个字节===32个比特位 --32个二进制位
向
右移分为两种:1.算术右移 规则右边丢弃,左边补原符号位
2.逻辑右移补0
在内存中存整数的二进制序列,第一个数符号位是0 1
我们当前编译器采用的是逻辑还是算术,用-1
int a = -1 ;
int b = a >> 1
知识:负数在内存中存放的是二进制的补码
对于正整数,三码相同
发现我们编译器用的是算术右移
不是逻辑右移呀大哥,因为你是补码
如果你是逻辑右移那补码就是01111111111111111111111
反码就是011111111111111111110她的原码就是
0000000000000000000001打印的是1
但是打印的是-1
同时右移左移后,对a没有发生改变
- 位操作符(条件操作数必须是整数)
& | ^
& - 按(二进制)位与
1和1才是1
其他的都是0
| - 按(二进制)位或
有 1全1
^ - 按(二进制)位异或
对应的二进制位进行异或
规则是相同为0,相异为1
用途:笔试题中
交换两个int变量的值, 3和5变成5和3不能引用第三个变量
数值太大,会溢出
用异或
算法的底层逻辑
我们这样理解int a = 3;
a ^ 0 ==
011
000
011就是a
a^0 = a
a^a
011
011
就是
a^a=0
完全符合相同为0
0和任何异或为任何
我们再来看
a=a^b
b=a^b
也就是a^b^b这个结果就是a^0就是a
这个时候b = a
-1^-1是0
- 练习:求一个整储存到内存中的二进制中1的个数
- 算术操作符
- 操作符的分类
- ^
int a = 13
0000000000000000001101
如何让他变成0000000000000000011101
a = a | (1<<4)
- 赋值操作符
笑死我
连续赋值从右向左
x = y +1
a = x
- 复合操作符
+= -= *= |=
一个等号叫赋值,两个等号叫判断相等
- 复合操作符
- 单目操作符(只有一个操作数)
- !
逻辑反操作
if(flag)
{
printf()}
if(!flag)
flag为假,我们打印
- - +
a = -a;
- sizeof(计算谁谁谁的大小)
char arr [10] = {0};
printf("%d",sizeof(a))计算a所占空间的大小,单位是字节
444 error
sizeof对于变量名可以省略括号,但是变量类型不行//证明sizof是操作符不是函数
比较灵活
- 计算数组大
char类型 10
int 类型 40
int arr [10] = {0};
sizeof(arr);
sizeof(int [10]);这是数组类型(除了数组名都是数组类型)
都是40
题目:
short s = 5;
int a = 10;
printf("%d",sizeof(s =a +2)
printf("%d",s)
2 5哈哈哈我知道
short占两个字节
s说了算
s = int 类型的12
你放到我这就要截断
大的放到我这小的空间
把多的东西去掉,保留有限位
不会因为放12s的空间变大
你放我这就得截断
这个时候还是s说了算
这里s = 5
注意了,sizeof括号内的表达式不参与计算,算都不算
还有test.c文件 >>>>test.exe
源文件 可执行程序
转换过程要经过编译 链接 运行
但是s =a +2要运行要在运行期间才能运行
但是sizeof计算s的大小,计算s = a +2的时候在编译器中进行
我们处理sizof是在编译器进行的,所以表达式不会计算
算都不算
- 计算数组大
- ~对一个数二进制位按位取反
-1
10000000000000001原码
11111111111111110反码
11111111111111111补码
int b = ~a对她的补码进行按位取反
00000000000000000
- 把a的二进制的第5位置成1
把a的二进制的第五位置成0
a | (1<<4)
000000000000000000011101变成
000000000000000000001101
怎么做
秒啊
- 把a的二进制的第5位置成1
- ++ --前置后置
后置++
计算规则:先使用再++
再使用,赋值给b,再自增
最后一个坑你 10 9哈哈哈傻逼
不建议你去深入i
int b =(++a)+(++a)+(++a);
在windows和linux里跑的不一样
垃圾代码
会让你从入门到放弃
我们时间放到有限地方
- !