目录
1.算数操作符
2.移位操作符
3.位操作符
练习1:不用临时变量,交换a,b的值
练习2:求一个整数存储在内存中的二进制中1的个数
4.复合赋值符
5.单目操作符
6.关系操作符
7.逻辑操作符
8.条件操作符
9.逗号表达式
10.下标引用、函数调用和结构成员
表达式求值
隐式类型转换(悄悄的进行类型转换)
问题表达式
1.算数操作符
+ - * / % // 加 减 乘 除 取余
1.除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数
2.对于 / 操作符如果两个操作数都为整数,执行整数除法(求商舍余)。而只要有浮点数,执行的就是浮点数除法。
3.% (取模)操作符的两个操作数必须为整数,若其中一个不为整数则报错,返回的是整除之后的余数。
#include<stdio.h> int main() { int a = 5; int b = 2; int c = 0; printf("a+b = %d\n", a + b);//相加 printf("a-b = %d\n", a - b);//相减 printf("a*b = %d\n", a * b);//相乘 printf("a/b = %d\n", a / b);//求商 printf("a%%b = %d\n", a % b);//取模 return 0; }
#include <stdio.h> int main() { /*double a = 5.0 / 2;*/ double a = 5 % 2.0;//报错 printf("a = %lf", a); return 0; }
2.移位操作符
>> << //右移 左移
移位操作符可分为 算术移位 和 逻辑移位
算术移位: 先移位,然后补足符号位 (通常是这个)
逻辑移位: 直接移位,0补齐
总结:
1.左移移动一位正数相当于直接乘以2,负数也一样,移动n位,乘以2 ^ n。
2.左位移一位 *2,右位移一位 /2 (-1右位移还是-1)
#include <stdio.h> #include <windows.h> int main() { int a = 16; int b = a << 1; int c = a >> 2; //>>整数移位,移动的是二进制 //0000 0000 0000 0000 0000 0000 0001 0000 int d = -1; int e = d >> 1; //在计算机中,数据是用补码存储的 //移位运算符操作的是补码 //-1的补码: //1111 1111 1111 1111 1111 1111 1111 1111 //移位后-1的二进制码不变 //1111 1111 1111 1111 1111 1111 1111 1111 1 //算数位移补符号位 printf("%d\n", b);//输出结果为32 printf("%d\n", c);//输出结果为4 printf("%d\n", e);//输出结果仍为-1,移位后-1的二进制码不变 system("Pause"); return 0; }
右移是以算术移位 的方式来进行右移的
例如:
我们先按照算术移位的方式去推导最终结果,然后再修改变量大小成 - 16进行验证。
警告:
1.移位操作符只能作用于整数,不能用于浮点数,因为浮点数的存储方式跟整数完全不同
2.对于移位运算符,不要移动负数位,这个是标准未定义的。
eg: int num = 10;
num >> -1;//error
3.位操作符
& (按位与) 二进制补码 两真才真(1) 一假则假(0)
| (按位或) 二进制补码 一真则真(1) 两假才假(0)
^ (按位异或) 二进制补码 相异为真(1) 相同为假 (0)
#include<stdio.h> int main() { int a = 3; //00000000 00000000 00000000 00000011 int b = 5; //00000000 00000000 00000000 00000101 int c1 = a & b; //00000000 00000000 00000000 00000001 =1 int c2 = a | b; //00000000 00000000 00000000 00000111 =7 int c3 = a ^ b; //00000000 00000000 00000000 00000110 =6 printf("c1 = %d\n", c1); printf("c2 = %d\n", c2); printf("c3 = %d\n", c3); return 0; }