1. 操作符分类
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
2. 算术操作符
包括 + - * / %
例如:计算 3/2
#include<stdio.h> int main() { int a=3/2; printf("%d\n",a) return 0; }
如果你觉得这样写,就大错特错了。
🍤 运行结果:
这是因为这里的 a 是整型的,计算出的结果就是整型,会自动舍去小数点后的数字。
更改 a 的类型为浮点数:
int main() { double a = 3 / 2; printf("%lf\n", a); return 0; }
其实,这样也是不对的。
🍤 运行结果:
仔细观察就会发现,这里的 a 虽然是 double 类型的,但 3 和 2 都是整形的, 3/2 计算后是 1,然后再将 1 装换成 double 型的赋给 a。
所以当计算的结果会出现浮点数时,除号的两端只要有一个小数就可以。
int main() { //下面三种方式都可以计算出 1.5 double a = 3.0 / 2.0; //double a = 3.0/2; //double a = 3 / 2.0; printf("%lf\n", a); return 0; }
注:
🍥 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数
🍥 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法
🍥 除法中,除数不可以为 0
🍥 % 操作符的两个操作数必须为整数。返回的是整除之后的余数
3. 移位操作符
<< 左移操作符 >> 右移操作符
移位操作符的操作数只能是整数。
移动的是二进制,因为能够处理的是二进制的信息
3.1 左移操作符
移位规则:左边抛弃、右边补0
例如:
#include<stdio.h> int main() { int a = 15; printf("%d\n",a<<1);//移动就是a中的2进制信息 return 0; }
🍤 图解:
🍤 运行结果:
3.2 右移操作符
移位规则:
首先右移运算分两种:
- 逻辑移位
左边用0填充,右边丢弃
- 算术移位
左边用原该值的符号位填充,右边丢弃
在C语言没有明确规定倒是算术右移还是逻辑右移,一般编译器上采用的是算术右移。
例如:
int a = -1;
对于移位运算符,不要移动负数位,这个是标准未定义的。
例如:
int a = 15; a>>-1;//error
移位移动的是补码的二进制序列
//tip: int a = 15; //00000000000000000000000000001111 - 原码 //00000000000000000000000000001111 - 反码 //00000000000000000000000000001111 - 补码 int b = -15; //10000000000000000000000000001111 - 原码 //11111111111111111111111111110000 - 反码(原码的符号位不变,其他位按位取反得到的就是反码) //11111111111111111111111111110001 - 补码(反码+1就是补码) //整数在内存中存储的是补码 //计算的时候也是使用补码计算的
4. 位操作符
位操作符有:(也是操作二进制位)
& //按位与 | //按位或 ^ //按位异或
🍩上述的操作数必须是整数。
例如:
// & 操作符 #include<stdio.h> int main() { int a = 3; //00000000000000000000000000000011 - 补码 int b = -5; //10000000000000000000000000000101 //11111111111111111111111111111010 //11111111111111111111111111111011 - 补码 int c = a & b; //& -- 对应二进制位有0则为0,两个同时为1,才是1 //00000000000000000000000000000011 //11111111111111111111111111111011 //00000000000000000000000000000011 - 补码 printf("%d\n", c);//3 return 0; }
// | 操作符 #include<stdio.h> int main() { int a = 3; //00000000000000000000000000000011 - 补码 int b = -5; //10000000000000000000000000000101 //11111111111111111111111111111010 //11111111111111111111111111111011 - 补码 int c = a | b; // | - 按(2进制)位或 - 对应的二进制位有1则为1,两个同时为0才是0 //00000000000000000000000000000011 //11111111111111111111111111111011 //11111111111111111111111111111011 - 补码 //11111111111111111111111111111010 //10000000000000000000000000000101 - -5 printf("%d\n", c);//-5 return 0; }
// ^ 操作符 #include<stdio.h> int main() { int a = 3; //00000000000000000000000000000011 - 补码 int b = -5; //10000000000000000000000000000101 //11111111111111111111111111111010 //11111111111111111111111111111011 - 补码 // int c = a ^ b; //^ - 按二进制位异或 -对应的二进制位相同为0,相异为1 //00000000000000000000000000000011 //11111111111111111111111111111011 //11111111111111111111111111111000 - 补码 //11111111111111111111111111110111 //10000000000000000000000000001000 - -8 printf("%d\n", c);//-8 return 0; }
实例1:交换2个整型变量
要想交换两个变量的值,最常见的方法是再创建一个变量,帮助我们实现:
#include<stdio.h> int main() { int a = 3; int b = 5; //交换 int tmp = a;//临时变量 tmp a = b; b = tmp; printf("交换前:a=%d b=%d\n", a, b); printf("交换后:a=%d b=%d\n", a, b); return 0; }
🍤 运行结果: