C day04
逻辑操作符
逻辑表达式的值必须是bool
双目逻辑操作符 == != > < >= <=
单目逻辑操作符 !非
所有的数字到可以当作bool 使用
0为假 其他的为真
逻辑操作符比算术操作符的优先级低
2<6<5 结果为 真
2<6 为真 结果是1
1<5 为真
多个逻辑关系之间需要使用 与 && 或者 或|| 连接
&& 连接的 所有基本表达式的计算结果都是true 结果才是true 否则就是false
|| 连接的 有一个基本表达式的计算结果是true 结果为true 都是false 才是 false
&& || 都具有短路特征 当前面的逻辑表达式能决定整个表达式的结果时 后面的内容根本就不计算
int num = 1;
1 || ++num
printf("%d",num);
结果还是 1
位操作符用来对二进制形式计算
双目位操作符 包括按位与 & 按位或| 按位异或^
都是先把参与计算的数据的二进制形式表示出来,然后两个数字的对应数位进行计算
按位与
0&0 0
0&1 0
1&1 1
按位与 可以把一个数字中的某些二进制数位清除成0
某个数位和0做按位与结果一定时0
和1按位与结果不变
char ch = -1;
ch & 0111 1111
按位或
按位或可以把一个数字中的某些数位设置成1
某个数位和0按位或不变
某个数位和1按位或时1
0|0 0
0|1 1
1|1 1
按位异或
按位异或可以把一个数字中的某些数位求反
某个数字和0按位异或结果不变
某个数字和1按位异或结果相反
0 ^ 0 0
1 ^ 0 1
1 ^ 1 0
移位操作符 把变量·中的所有二进制位整体向左或者右移动n位
左移<<
右移>>
移位操作符要求左右两边各是一个可以当数字使用的东西
左边的数字是要被进行移位操作的数字
右边的数字是要移动的位数
在移位操作过程中有些二进制位上的数倍丢弃有些二进制用新数字填充
0x00f8 << 2
#include <stdio.h>
#include <stdbool.h>
int main(){
int num = 0x00f8;
printf("num: %d\n",num);
num = num << 2;
printf("move left after num : %d\n",num);
num = num >> 4;
printf("move right after num : %d\n",num);
num = -1;
printf("move right after num: %d\n", num >> 1);
num = -123123;
printf("move right after num : %d\n",num>>2);
return 0;
}
左移操作中控出来的二进制位上一定填充0
有符号数字右移后所有空出来的二进制位上填充符号位
无符号数字右移后空出来的二进制位上填充0
如果移动过程中没有丢失有效数据
向右移动 除以2的n次方
向左移动 乘以2的n次方
~ 是一个单目位操作符 表示按位求反 这个操作符的右边需要提供一个数字
0000 1111 15
~0000 1111 ~15
1111 0000 240
~15
240
&是取地址操作符
这个操作符的右边需要跟着一个变量
地址数据对应的占位符是%p
*操作符可以利用地址数据便是变量 这个操作符的右边需要跟着一个地址数据
#include <stdio.h>
int main(){
int num = 3;
printf("&num is :%p\n",&num );
*(&num) = 7;
printf("num is : %d\n",num);
return 0;
}
三目操作符需要三个信息配合次啊能编写出一个完整的表达式
这个表达式可以根据一个布尔值从两个简单表达式中选择一个来进行计算 倍选择的这个简单表达式的计算结果就是整个三目表达式的计算结果
bool ? x : y
bool is true value x
bool is false value y
一个表达式中如果包含多个 不同类型的数据 必须把他们转换成同一个类型 然后才能计算
这个转换过程是计算机自动完成的,叫做 隐式类型转换
隐式类型转换的过程中,会把空间小的数据转换成占空间大的数据
如果所占空间大小一样但是类型不同则安装int 转float 有符号转无符号
1?1:0.3;
sizeof(1?1:0.3);
8
还可以 在程序中任何时候任意给一个数字指定数据类型 就是强制类型转换
强制类型转换不受任何规则的限制,可以任意指定数据类型,有可能导致错误
强制类型转换的实现方法是临时创建一个新数据并用旧数据进行赋值
强制类型转换不会修改原数据