往期 C语言 知识回顾:
链接:
C语言基础之【C语言概述】
C语言基础之【数据类型】(上)
C语言基础之【数据类型】(下)
👨💻 博主正在持续更新C语言基础系列中。
❤️ 如果你觉得内容还不错,请多多点赞。⭐️ 如果你觉得对你有帮助,请多多收藏。(防止以后找不到了)
👨👩👧👦
C语言基础系列
持续更新中~,后续分享内容主要涉及C++全栈开发
的知识,如果你感兴趣请多多关注博主。
常用运算符分类
运算符
:C语言中用于操作数据的基本工具。
运算符类型 | 作用 |
---|---|
算术运算符 | 用于基本的数学运算 |
赋值运算符 | 用于给变量赋值 |
关系运算符 | 用于比较两个值的大小关系(并返回一个布尔值) |
逻辑运算符 | 用于逻辑判断(并返回一个布尔值) |
位运算符 | 用于对二进制位进行操作 |
条件运算符 | 用于简单的条件判断 |
指针运算符 | 用于操作指针 |
逗号运算符 | 用于分隔多个表达式,返回最后一个表达式的值 |
类型转换运算符 | 用于强制类型转换 |
sizeof运算符 | 用于获取数据类型或变量的大小(字节数) |
算术运算符:包括
+
、-
、*
、/
、%
、++
、--
等。赋值运算符:包括
=
、+=
、-=
、*=
、/=
、%=
、<<=
、>>=
、&=
、^=
、|=
等。关系运算符:包括
==
、!=
、>
、<
、>=
、<=
等。
- 也称为
比较运算符
逻辑运算符:包括
&&
、||
、!
等。位运算符:包括
&
、|
、^
、~
、<<
、>>
等。条件运算符:
? :
- 也称为
三元运算符
,其格式为表达式1? 表达式2 : 表达式3
指针运算符:包括
&
和*
*
用于获取指针所指向的变量的值。
&
用于获取变量的地址。逗号运算符:
,
- 例如:
int a = (1 + 2, 3 + 4);
,a
的值为7
类型转换运算符:
(类型)
sizeof运算符
sizeof(int)
可以得到int
类型在当前系统中所占用的字节数sizeof(a)
可以得到变量a
所占用的字节数
算术运算符
算术运算符
:用于基本的数学运算
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
+ | 正号 | +3 | 3 |
- | 负号 | -3 | -3 |
+ | 加 | 10 + 5 | 15 |
- | 减 | 10 - 5 | 5 |
* | 乘 | 10 * 5 | 50 |
/ | 除 | 10 / 5 | 2 |
% | 取模(取余) | 10 % 3 | 1 |
++ | 前置自增 | a=2; b=++a; | a=3; b=3; |
++ | 后置自增 | a=2; b=a++; | a=3; b=2; |
-- | 前置自减 | a=2; b=--a; | a=1; b=1; |
-- | 后置自减 | a=2; b=a--; | a=1; b=2; |
- 正号 (
+
):表示正数,通常可以省略。- 负号 (
-
):表示负数。- 加 (
+
):用于两个数的加法运算。- 减 (
-
):用于两个数的减法运算。- 乘 (
*
):用于两个数的乘法运算。- 除 (
/
):用于两个数的除法运算。- 取模 (
%
):用于两个数的取模运算,返回余数。- 前置自增 (
++
):先自增,再使用变量的值。- 后置自增 (
++
):先使用变量的值,再自增。- 前置自减 (
--
):先自减,再使用变量的值。- 后置自减 (
--
):先使用变量的值,再自减。
- 前置自 增/减 和 后置自 增/减 的区别在于
变量值的更新时机
赋值运算符
赋值运算符
:用于给变量赋值
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
= | 赋值 | a=2; b=3; | a=2; b=3; |
+= | 加等于 | a=0; a+=2; | a=2; |
-= | 减等于 | a=5; a-=3; | a=2; |
*= | 乘等于 | a=2; a*=2; | a=4; |
/= | 除等于 | a=4; a/=2; | a=2; |
%= | 模等于 | a=3; a%=2; | a=1; |
- 赋值 (
=
):将右侧的值赋给左侧的变量。- 加等于 (
+=
):将左侧变量与右侧值相加,结果赋给左侧变量。- 减等于 (
-=
):将左侧变量与右侧值相减,结果赋给左侧变量。- 乘等于 (
\*=
):将左侧变量与右侧值相乘,结果赋给左侧变量。- 除等于 (
/=
):将左侧变量与右侧值相除,结果赋给左侧变量。- 模等于 (
%=
):将左侧变量与右侧值取模,结果赋给左侧变量。
关系运算符
关系运算符
:用于比较两个值的大小关系,返回布尔值(1
表示真,0
表示假)
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
== | 等于 | 4 == 3 | 0 |
!= | 不等于 | 4 != 3 | 1 |
< | 小于 | 4 < 3 | 0 |
> | 大于 | 4 > 3 | 1 |
<= | 小于等于 | 4 <= 3 | 0 |
>= | 大于等于 | 4 >= 3 | 1 |
==
:检查两个值是否相等,相等返回1
,否则返回0
!=
:检查两个值是否不相等,不相等返回1
,否则返回0
<
:检查左侧值是否小于右侧值,是则返回1
,否则返回0
>
:检查左侧值是否大于右侧值,是则返回1
,否则返回0
<=
:检查左侧值是否小于或等于右侧值,是则返回1
,否则返回0
>=
:检查左侧值是否大于或等于右侧值,是则返回1
,否则返回0
逻辑运算符
逻辑运算符
:用于逻辑判断(并返回一个布尔值)
运算符 | 术语 | 示例 | 结果 |
---|---|---|---|
! | 逻辑非 | !a | 用于对一个布尔值取反 |
&& | 逻辑与 | a && b | 用于判断两个条件是否同时为真 |
![]() | 逻辑或 | ![]() | 用于判断两个条件是否至少有一个为真 |
!
(逻辑非)
- 如果操作数为真(
非零
),则结果为假(0
)- 如果操作数为假(
0
),则结果为真(1
)
&&
(逻辑与)
- 只有当两个操作数都为真时,结果才为真(
1
)- 否则为假(
0
)
||
(逻辑或)
- 只要有一个操作数为真,结果就为真(
1
)- 只有当两个操作数都为假时,结果才为假(
0
)
运算符优先级
运算符优先级: 决定了表达式中运算符的执行顺序。
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
---|---|---|---|---|---|
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | – |
() | 圆括号 | (表达式)/函数名(形参表) | 左到右 | – | |
. | 成员选择(对象) | 对象.成员名 | 左到右 | – | |
-> | 成员选择(指针) | 对象指针->成员名 | 左到右 | – | |
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
~ | 按位取反运算符 | ~表达式 | 右到左 | 单目运算符 | |
++ | 自增运算符 | ++变量名/变量名++ | 右到左 | 单目运算符 | |
-- | 自减运算符 | –变量名/变量名– | 右到左 | 单目运算符 | |
* | 取值运算符 | *指针变量 | 右到左 | 单目运算符 | |
& | 取地址运算符 | &变量名 | 右到左 | 单目运算符 | |
! | 逻辑非运算符 | !表达式 | 右到左 | 单目运算符 | |
(类型) | 强制类型转换 | (数据类型)表达式 | 右到左 | – | |
sizeof | 长度运算符 | sizeof(表达式) | 右到左 | – | |
3 | * | 乘 | 表达式*表达式 | 左到右 | 双目运算符 |
/ | 除 | 表达式/表达式 | 左到右 | 双目运算符 | |
% | 余数(取模) | 整型表达式%整型表达式 | 左到右 | 双目运算符 | |
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | 左到右 | 双目运算符 | |
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | 左到右 | 双目运算符 | |
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | 左到右 | 双目运算符 | |
< | 小于 | 表达式<表达式 | 左到右 | 双目运算符 | |
<= | 小于等于 | 表达式<=表达式 | 左到右 | 双目运算符 | |
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!=表达式 | 左到右 | 双目运算符 | |
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | ![]() | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | ![]() | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1?表达式2:表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | – |
*= | 乘后赋值 | 变量*=表达式 | 右到左 | – | |
/= | 除后赋值 | 变量/=表达式 | 右到左 | – | |
%= | 取模后赋值 | 变量%=表达式 | 右到左 | – | |
+= | 加后赋值 | 变量+=表达式 | 右到左 | – | |
-= | 减后赋值 | 变量-=表达式 | 右到左 | – | |
<<= | 左移后赋值 | 变量<<=表达式 | 右到左 | – | |
>>= | 右移后赋值 | 变量>>=表达式 | 右到左 | – | |
&= | 按位与后赋值 | 变量&=表达式 | 右到左 | – | |
^= | 按位异或后赋值 | 变量^=表达式 | 右到左 | – | |
![]() | 按位或后赋值 | 变量|=表达式 | 右到左 | – | |
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | – |
- 优先级高的运算符先执行
- 优先级相同的运算符按结合方向执行
类型转换
类型转换
:指将一种数据类型的值转换为另一种数据类型的过程。数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。
类型转换可以分为两种:
隐式类型转换(自动类型转换)
:隐式类型转换是由编译器自动完成的。
- 表达式中包含不同类型的操作数。
- 赋值时,右侧表达式的类型与左侧变量的类型不一致。
显式类型转换(强制类型转换)
:通过程序员手动指定的。
- 使用强制类型转换运算符
(类型)
- 语法:
(目标类型) 表达式
隐式类型转换:
从小类型向大类型转换
:
如果表达式中包含不同类型的操作数,较小的类型会自动转换为较大的类型。
int a = 10; double b = 3.14; double c = a + b; // a 自动转换为 double 类型
赋值时的类型转换
:如果赋值时右侧表达式的类型与左侧变量的类型不一致,右侧的值会自动转换为左侧变量的类型。
int a = 10; double b = 3.14; a = b; // b 的值被截断为 int 类型,a = 3
显式类型转换:
int a = 10; int b = 3; double c = (double)a / b; // 将 a 强制转换为 double 类型,结果为 3.333...
注意事项:强制类型转换可能会导致数据丢失或精度损失。
double d = 3.14; int i = (int)d; // i = 3,小数部分丢失
类型转换的常见场景
1.算术运算中的类型转换
如果表达式中包含不同类型的操作数,较小的类型会自动转换为较大的类型。
int a = 10; double b = 3.14; double c = a + b; // a 自动转换为 double 类型
2.赋值时的类型转换
如果赋值时右侧表达式的类型与左侧变量的类型不一致,右侧的值会自动转换为左侧变量的类型。
int a = 10; double b = 3.14; a = b; // b 的值被截断为 int 类型,a = 3
3.函数调用时的类型转换
如果函数参数的类型与实参的类型不一致,实参的值会自动转换为形参的类型。
void print(double d) { printf("%f\n", d); } int main() { int a = 10; print(a); // a 自动转换为 double 类型 return 0; }
4.指针类型转换
指针类型之间的转换需要显式类型转换。
int a = 10; int *p = &a; double *q = (double *)p; // 将 int 指针强制转换为 double 指针
隐式类型转换
#include <stdio.h>
int main()
{
int num = 5;
printf("s1=%d\n", num / 2);
printf("s2=%lf\n", num / 2.0);
return 0;
}
输出:
s1=2
s2=2.500000
1.整数除法:
- 当两个整数相除时,结果也是整数,小数部分会被截断。
- 例如:
5 / 2
的结果是2
2.浮点数除法:
- 当至少有一个操作数是浮点数时,结果也是浮点数。
- 例如:
5 / 2.0
的结果是2.5
总结:整数除法会截断小数部分,而浮点数除法会保留小数部分。
显式类型转换
显式类型转换指的是使用
强制类型转换运算符
,将一个变量或表达式转化成所需的类型。其基本语法格式:
(类型说明符) (表达式)
#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;
}
输出:
x=3.600000, i=3