1、 逻辑运算需要先将数据从内存加载到cpu,在cpu中完成算术逻辑运算。只有重新再写回内存时,才会改变原数据
int a = 10;
a+10; // 不改变a的大小
a<<1 // 不改变a的大小
2、位移操作符
左移相当于 *2 右移相当于 /2
左移操作符 <<
规则:左边抛弃,右边补0
右移操作符 >>
规则: (1)逻辑移位,左补0,右丢弃(一般是无符号数) (2)算术移位,左用原该值的符号位填充,右丢弃(有符号数)
移位时,不能移动负数位。 如 x >>-1 , 错误
3、逻辑反 !
若操作数值为0, ! 运算结果为1( 逻辑真 ); 若操作数值为非0, ! 的运算结果为 0 。
c语言中,没有布尔类型 , 只有 0 表示真,!0 表示假。 逻辑反!,不是按位反 按位取反是: ~
4、强制类型转化
强制类型转化不改变转化目标的内容。
int a = 9;
float b = (float)a ; a的内容不变,只有通过赋值,才会改变。
5、逻辑与 && 按位与&
&& 对于多个表达式而言 & 对于二进制bit位&& 在判断多个表达式时,第一个表达时若为假,就会出现逻辑短路,就不会对后面的表达式判断及执行
||在判断多个表达式时,第一个表达时若为真,就会出现逻辑短路,就不会对后面的表达式判断及执行
逻辑表达式的优先级 优先级顺序为 ! ——> && ——> || ! 高于算术运算符,&& 和 || 低于 关系运算符例题: #include<stdio.h>
int main( ) { int i = 0,a = 0,b = 2,c = 3,d = 4;
i = a++ && ++b && d++; // 先判断a为0,则短路。++b && d++不被判断和执行 //i = a++ || ++b ||d++; // a = 1 b = 3 判断逻辑真 得出结果后 短路 d不执行 printf("%d%d%d%d",a,b,c,d); // 执行结果1 2 3 4 return 0;}
6、逗号表达式
逗号表达式,从右到左一次执行。整个表达式的结果是最后一个表达式的结果。 int a = 1; int b = 2; int c = ( a>b,a=b+10,a,b=a+1); // c = 13
7、变量理解
对于一个变量,有开辟的 空间 和变量对应空间上的 内容
使用变量的空间 ----> 左值 使用变量的内容 ----> 右值
8、整型提升 判断数据是否进行整型提升,则需要看cpu相应的运算器是否执行该数据,即算术逻辑运算。 对于小于32个bit位的数据类型,在进行算术逻辑运算时,需要进行整型提升。
如何进行整型提升? 对于有符号数据类型, 根据数据的符号位,高位补充符号位。
对于无符号数据类型, 高位直接补0.例: char a , b , c ; … a = b + c;//显然要进行整型提升
例: char c = 1;
printf("%u\n",sizeof(c)); // 1 printf("%u\n",sizeof(+c));//4 参与算术逻辑运算, printf("%u\n",sizeof(!c));//4 参与算术逻辑运算