目录
算术操作符
- /要注意两个操作符都为整数时计算结果为整数,只要其中一个为浮点数计算结果为浮点数,得到的是商
- %只能用于整数,计算的是余数
移位操作符
(移动的是补码二进制位,因为整数在内存中存储的是补码)
(浮点数是不能进行移位操作符)
- >>右移操作符(取决于编译器)
- 算术右移(左边用原来的符号位,右边丢弃)
- 逻辑右移(左边直接补0,右边丢弃)
不要移动负数位,这个标准未定义
16进制里面 abcdef分别表示(10 11 12 13 14 15)
整数的二进制表示
-
原码:把一个数按照正负直接翻译成二进制就是原码。
最高位表示符号位,最高位0表示正数,1表示负数
正整数原码,反码,补码是相同的。
- 反码:原码的符号位不变,其他位按位取反
- 补码:反码+1
//以3和-5为例计算左移右移后的结果
#include<stdio.h>
int main()
{
int a = 3;
//补码:00000000000000000000000000000011
printf("%d\n",(a<<1));
//a<<1补码:00000000000000000000000000000110---对应6
int b = -5;
//原码:10000000000000000000000000000101
//补码:11111111111111111111111111111011
//b>>1补码:11111111111111111111111111111101(vs采用的是算数位移,最高位补的是1)
//b>>1原码:10000000000000000000000000000011--对应-3
printf("%d\n",(b>>1));
return 0;
}
位操作符
(二进制补码进行计算)
(只能对整数进行操作)
- &按位与(有0为0,没0才为1)
- | 按位或(有1为1,全为0才为0)
- ∧按位异或(对应相同为0,相异为1)
例题
例1 不创建临时变量进行两个整数的交换
a∧a=0
0∧a=a
(多项异或满足交换律)
//不创建临时变量实现两个数的交换
#include<stdio.h>
int main()
{
int a = 3;
int b = 5;
printf("交换前:%d %d\n", a, b);
a = a ^ b;
b = a ^ b;//(就相当于b=a^b^b,此处的a是原来的a,最后所得结果也是原来的a)
a = a ^ b;//(就相当于a=(a^b)^a,此时的a,b是原来初始的a,b,不是执行后被更改过的a和b)
printf("交换后:%d %d", a, b);
return 0;
}
例题2 求一个整数存在二进制内的1的个数
思路:
按位与&上一个1就可以知道一个数最低位是什么
向右移动1位
#include<stdio.h>
int main()
{
int n = 0, count = 0;
scanf("%d", &n);
for (int i = 0; i < 32; i++)
{
if ((n & 1)== 1)
{
count++;
}
n = n >> 1;
}
printf("%d\n", count);
return 0;
}
单目操作符:
~ 对一个数的二进制按位取反
例3 把特定位置的0改成1
#include<stdio.h>
int main()
{
int a = 3;
//补码:00000000000000000000000000000011(假设要把从右到左的第5个0改成1)
//就是要把a变成:00000000000000000000000000010011这串补码——对应19
//我们可以在a的基础上按位|上00000000000000000000000000010000
a = a|16;
printf("%d ", a);
return 0;
}
(类型)强制类型转换,是临时的状态
sizeof()和数组,主要数组名两个例外,数组名在传参时的注意点(可以回看关于数组那部分)
逻辑操作符(注意和按位与,按位或区别开来)
&&逻辑与:(计算成真为1 成假为0)(只要左边为假有0就不再计算右边的式子了,直接整体得0)
|| 逻辑或:(左边为真,右边就不再计算)
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
条件操作符
(表达式1)?(表达式2) :(表达式3)
判断表达式1,如果表达式1为真,那么就执行表达式2,否则就执行表达式3
逗号表达式
从左向右依次计算,整个表达式的结果是最后一个表达式的结果
其他运算符
下标引用[ ],函数调用()
访问结构体(联合体)成员
- 指针—>成员
- 结构体(联合体)变量·成员
表达式求值
-
隐形类型转换
整型提升:计算机CPU进行整型计算时,要先把char和short转换为int。
按照变量数据的符号位进行提升,在高位补符号位(负数补1,正数和无符号补0)
-
算术转换(≥int类型计算时的类型统一)
要先把类型统一为排名高的计算
- 优先级
- 结合性
- 是否控制求值顺序
会遇到一些问题表达式
操作路径会不同
计算表达式时操作数什么时候准备好呢?