一、运算符分类
运算符类型 | 说明 |
---|---|
算术运算符 | 用于四则运算 |
赋值运算符 | 将表达式的值赋给变量 |
比较运算符 | 用于表达式的比较,返回真或假 |
逻辑运算符 | 用于根据表达式的值返回真值或假值 |
位运算符 | 用于处理数据的位运算 |
sizeof运算符 | 计算对象的字节数长度 |
1.1 算术运算符
运算符 | 术语/说明 | 示例 | 结果 |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 符号 | -3 | -3 |
+ | 加号 | 2+3 | 5 |
- | 减号 | 5-3 | 2 |
* | 乘号 | 2*3 | 6 |
/ | 除号 | 10/2 | 5 |
% | 取模(取余) | 10%3 | 1 |
++ | 前自增 | a=2,b=++a | a=3,b=3 |
++ | 后自增 | a=2, b=a++ | ,a=3,b=2 |
-- | 前自减 | a=3,b=--a | a=2,b=2 |
-- | 后自减 | a=3,b=a-- | a=2,b=3 |
注意
- m % n ==> m和n只能是整型
- int / int = int
- int / float = float ==> 将int类型转换为float类型进行计算
- float / int = float ==> 将int类型转换为float类型进行
- float / float = float
- double / int = double ==> 将int类型转换为double类型进行计算
- int / double = double ==> 将int类型转换为double类型进行计算
- float / double = double ==> 将float类型转为double类型进行计算
- double / float = double ==> 将float类型转为double类型进行计算
- double / double = double
算术运算符的使用示例
#include <stdio.h>
int main(){
printf("3 + 2 = %d\n", 3+2);
printf("3 - 2 = %d\n", 3-2);
printf("3 * 2 = %d\n", 3*2);
printf("3 / 2 = %d\n", 3/2); // 返回的是一个比真实值小的最大整数
printf("10.0f / 3 = %f\n", 10.0f/3); // 返回真实值
printf("10.0f / 3.0f = %f", 10.0f/3.0f);
printf("10.0 / 3.0 = %lf", 10.0/3.0);
int i = 10;
int j = i++; // 使用i之后,在对i进行自增1 i = 11, j = 10
printf("i = %d\tj = %d\n", i, j);
j = ++i; // 对i进行自增1之后,使用i i = 12, j = 12
printf("i = %d\tj = %d\n", i, j);
j = i--; // 使用i之后,在对i进行自减1 i = 11, j = 12
printf("i = %d\tj = %d\n", i, j);
j = --i; // 对i自减1,之后在使用i; i = 10, j =10
printf("i = %d\tj = %d\n\n", i, j);
return 0;
}
1.2 赋值运算符
赋值符号与算术运算符的连用
运算符 | 术语/说明 | 示例 | 结果 |
---|---|---|---|
= | 赋值符号 | a=3,b=2, a=b | a=2,b=2 |
+= | 加等于 | a=2,a+=1;a=a+1 | a=3 |
-= | 减等于 | a=3, a-=2;a=a-2 | a=1 |
*= | 乘等于 | a=3,a=2;a=a2 | a=6 |
/= | 除等于 | a=6,a/=3;a=a/3 | a=2 |
%= | 模等于 | a=10,a%=3;a=a%3 | a=1 |
#include <stdio.h>
int main(){
int c1;
c1 = 10; // 将10赋值给c1
printf("c1 = %d\n", c1);
c1 += 1; // c1 = c1 + 1
printf("c1 += 1 -> c1 = %d\n", c1);
c1 -= 1; // c1 = c1 -1
printf("c1 -= 1 -> c1 = %d\n", c1);
c1 *= 2; // c1 = c1 * 2
printf("c1 *= 2 -> c1 = %d\n", c1);
c1 /= 2; // c1 = c1 /2
printf("c1 /= 2 -> c1 = %d\n", c1);
c1 %= 3; // c1 = c1 % 3
printf("c1 %%= 3 -> c1 = %d\n", c1);
return 0;
}
1.3 比较运算符
比较运算中,返回一个_Bool类型的数据,这是C99标准中添加的类型。即逻辑值true和false。因为C语言用值1表示true,值0表示false,所以_Bool类型实际上也是一种整数 类型。但原则上它仅占用1位存储空间,因为对0和1而言,1位的存储空间足够了
运算符 | 术语/说明 | 示例 | 结果 | |
---|---|---|---|---|
== | 相等于 | 4 == 3 | 0 | |
!= | 不等于 | 4 != 3 | 1 | |
< | 小于 | 4 < 3 | 0 | |
> | 大于 | 4 > 3 | 1 | |
<= | 小于等于 | 4 <= 3 | 0 | |
>= | 大于等于 | 4 >= 1 | 1 |
1.4 逻辑运算符
运算符 | 术语/说明 | 示例 | 结果 |
---|---|---|---|
! |
非 | !a |
如果a为假,则!a为真.如果a为真,则!a为假 |
&& |
与 | a && b |
如果a和b都为真,则结果为真,否则为假 |
|| |
或 | a||b |
如果a或b有一个为真,则结果为真,二者都为假时,结果为假 |
比较运算符和逻辑运算符示例
#include <stdio.h>
int main(){
_Bool x1=0;
_Bool x2=1;
printf("!0 = %d\n", !x1);
printf("!1 = %d\n", !x2);
printf("1 && 1 = %d\n", x2 && x2);
printf("1 && 0 = %d\n", x2 && x1);
printf("0 && 0 = %d\n", x1 && x1);
printf("1 || 0 = %d\n", x2 || x1);
printf("1 || 1 = %d\n", x2 || x2);
printf("0 || 0 = %d\n", x1 || x1);
return 0;
}
1.5 位运算符
运算符 | 中文名称 | 功能描述 |
---|---|---|
& |
按位与 | (m&n )参与运算的m、n,如果相应位数都为1,则结果为1 |
| |
按位或 | (m|n )参与运算的m、n,如果相应为数只要有一个1则为1 |
^ |
按位异或 | (m^n )参与运算的m、n,如果对应位数不同时,结果为1 |
~ |
按位取反 | (~m )将m的二进制数+1后乘-1,~m=-(m+1) |
>> |
右移动 | (m >> n )将m的二进制位全部右移n为,低位丢弃高位补0 |
<< |
左移动 | (m << n )将m的二进制位全部左移n为,高位丢弃低位补0 |
位运算符使用示例
#include <stdio.h>
int main(){
printf("10u & 9u = %d\n", 10u & 9u); // 10u & 9u = 8
printf("10u | 9u = %d\n", 10u | 9u); // 10u | 9u = 11
printf("10u ^ 9u = %d\n", 10u ^ 9u); // 10u ^ 9u = 3
printf("~10u = %d\n", ~10u); // ~10u = -11
printf("10u << 2 = % d\n", 10 << 2); // 10u << 2 = 40
printf("10u >> 2 = %d\n", 10 >> 2); // 10u >> 2 = 2
return 0;
}
1.6 运算符的优先级
1.7 类型转换
1.7.1 隐式转换
#include <stdio.h>
int main()
{
int num = 5;
printf("s1=%d\n", num / 2);
printf("s2=%lf\n", num / 2.0);
return 0;
}
1.7.2 强制类型转化
强制类型转换指的是使用强制类型转换运算符,将一个变量或表达式转化成所需的类型,其基本语法格式如下所示:
(类型) (表达式或变量)
#include <stdio.h>
int main()
{
float x = 0;
int i = 0;
x = 3.6f;
i = x; //x为实型, i为整型,直接赋值会有警告
i = (int)x; //使用强制类型转换
printf("x=%f, i=%d\n", x, i);
return 0;
}