运算符的“目”:
X目运算符就是需要X个变量参加运算的运算符,例如数学中的“加号”就是二目运算符,因为它需要两个变量参加运算,即两个加数。
一、算数运算符
符号 | 功能 | 说明 | 优先级 |
---|---|---|---|
+ | 加号 | 二目 | 1 |
- | 减 | 二目 | 1 |
* | 乘 | 二目 | 2 |
/ | 除 | 二目 | 2 |
% | 取余 | 二目 | 2 |
“%“是取余运算符,它的作用是使两个整数相除,取其余数。
例如:
5%3 的值是 2, (5 ÷ 3 = 1…2)
5%2 的值是 1, (5 ÷ 2 = 2…1)
符号 | 功能 | 说明 | 优先级 |
---|---|---|---|
+ | 正号 | 单目 | 3 |
- | 负号 | 单目 | 3 |
说明:
- 优先级越大越先计算。例如数学中的“先算乘除,再算加减”,就是因为“乘和除”的优先级比“加和减”大。
- 如果优先级相同,则按从左到右的顺序计算。
- 与数学相同,C语言中优先计算括号中的内容。例如 (2+3)*4 的值是20。可以说“()”的优先级是最大的。
- 建议在使用多个运算符时使用括号,因为一些运算符的优先级比复杂,不方便记忆
二、自增与自减运算符
-
++ 自增运算符
-
– 自减运算符
说明:它们都是单目运算符
用法:
a++ 相当于 a = a + 1
a-- 相当于 a = a - 1
说明:a++ 与 ++a的区别
-
a++:先执行完当前语句,再使a加1
#include<stdio.h> void main() { int a = 1; printf("%d", a++); // 输出1 }
-
++a:先使a加1,再执行当前语句
#include<stdio.h> void main() { int a = 1; printf("%d", ++a); // 输出2 }
a–和--a区别与此相同
三、位运算符
位运算符只能用于整数,不能用于小数
位运算符的优先级比较复杂,暂不做说明
位运算符的使用
假设以下例子中使用的类型都是unsigned char
-
>>:位右移
示例:4 >> 1 的值为2
计算过程:
- 将4转为二进制 0000 0100
- 整体向右移动1位得 0000 0010 (前面补0)
- 将结果转为10进制即为2
-
<<:位左移
示例:2 << 1的值为4
计算过程:
- 将2转为二进制 0000 0010
- 整体向左移动1位得 0000 0100 (后面补0)
- 将结果转为10进制即为4
-
^:位异或
说明:如果对应为相同,则为0,否则为1
示例:2 ^4 的值为6
计算过程:
- 0000 0010 (2的二进制)
- 0000 0100(4的二进制)
- 0000 0110 (结果为6)
-
&:位与
说明:如果对应都是1,则为1,否则为0
示例:2 & 4的值为0
- 0000 0010(2的二进制)
- 0000 0100(4的二进制)
- 0000 0000(结果为0)
-
|:位或
说明:如果对应都是1,则为1,否则为0
示例:2 | 4 的值为6
- 0000 0010(2的二进制)
- 0000 0100(4的二进制)
- 0000 0110(结果为6)
-
~:位取反
说明:对应位1变0,0变1
示例:~4 的值是 251
- 0000 0100 (4的二进制)
- 1111 1011 (将各位取反,转换为十进制,结果为251)
有些同学可能会发现上面的表达式有一些结果是“错误的”
例如:
printf("%d", ~4) 的输出结果是 -5 而不是 251 ,这是为什么呢?
这就要涉及到C语言中的“变量提升”了,我们会在本篇文章的最后一小节学习它。
四、赋值运算符
符号 | 功能 | 说明 | 优先级 |
---|---|---|---|
= | 赋值运算 | 二目 | 0 |
赋值运算符即将“=”右面的值赋给左面的变量,它的优先级是最低的。
五、复合赋值运算符
符号:+=、-=、*=、/=、%=、&=、|=、<<=、>>=
优先级:0
说明:二目运算符
复合赋值运算符就是一些二目运算符与“=”的结合,他们的优先级都是0
例如:
a += 6 相当于 a = a + 6
a *= 2 相当于 a = a * 2
六、变量提升与类型强制转换
-
变量提升
- 在C语言表达式中,计算机自动将char、unsigned char、short、unsigned short转换为int类型
- 在C语言中,会将表达式中的所有数据的类型转换为这个表达式中优先级最高的类型
C语言中各类型的优先级从高到低依次为:
long double、double、float、 unsigned long long、long long、unsigned long、long、unsigned int、int
-
类型强制转换
类型强制转换的写法为
(目标类型)要转换的值或变量
例如:将3.14转换为整数
printf("%d", (int)3.14); // 输出3 //想一想把(int)去掉会输出什么
所以这就很好的解释了为什么printf("%d", ~4)的值是-5而不是251,因为“4”默认为int类型,将其取反后恰好是-5的补码。那么,如果想使~4的值为251应该怎么做呢?
#include<stdio.h>
void main()
{
// 方法一
printf("%d\n", (unsigned char)~4);
//方法二
unsigned char a = 4;
a = ~a;
printf("%d\n", a);
}
小练习
想一想,下面的三条语句分别输出什么?为什么?
#include<stdio.h>
void main()
{
unsigned char a = 255, b = 2;
printf("%d\n", a * b);
printf("%.2f\n", 3 / 4);
printf("%.2f\n", (float)3 / 4);
}
解析
输出结果分别为510、0.00、0.75
- unsigned char的最大值是255,但在计算a * b时计算机将它们都转换成了int,所以可以正常输出a * b(即510)的值,且a * b是int类型
- 3和4都是整数类型(且默认为int),整数和整数进行运算,结果仍是整数,所以3/4的值为0,“.2f”表示保留两位小数,所以输出0.00。
- "()"的优先级是最大的,所以这个语句会将3转为为float类型,而4是默认的int类型。在计算时,会将优先级较低的int型“4”转换为float类型,小数和小数的计算结果是小数,且值为0.75,“.2f”表示保留两位小数,所以输出0.75。
知识点:
输出小数时默认保留6位小数
好了,文章到这里就结束了,我们下一节再见
每周五晚20:00更新