C语言基础-运算符
算术运算符
算术运算符简介
C语言提供了以下常用的算术运算符,用于基本数学计算。
| 运算符 | 含义 | 示例 | 结果说明 |
|---|---|---|---|
+ |
加法 | a + b |
a与b相加 |
- |
减法 | a - b |
a减去b |
* |
乘法 | a * b |
a与b相乘 |
/ |
除法 | a / b |
a除以b(整型除法会舍去小数) |
% |
取余(模) | a % b |
a除以b的余数(仅用于整数) |
运算符优先级
| 优先级 | 运算符 | 结合性 |
|---|---|---|
| 高 | * / % |
从左到右 |
| 低 | + - |
从左到右 |
小括号
()可改变优先级,提高可读性。
整数除法 vs 浮点除法
int a = 7, b = 2;
float x = 7.0, y = 2.0;
printf("%d\n", a / b); // 输出 3(舍去小数)
printf("%f\n", x / y); // 输出 3.500000
自增和自减运算符
| 运算符 | 含义 | 示例 | 说明 |
|---|---|---|---|
++ |
自增1 | i++ 或 ++i |
i增加1(前后缀略有区别) |
-- |
自减1 | i-- 或 --i |
i减少1 |
区别:
i++:先使用后加++i:先加后使用
示例代码
#include <stdio.h>
int main() {
int a = 10, b = 3;
int i = 5, j;
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);
// 后缀自增:先使用,再加1
j = i++;
printf("后缀自增:j = %d, i = %d\n", j, i); // j = 5, i = 6
// 前缀自增:先加1,再使用
i = 5; // 重置 i 的值
j = ++i;
printf("前缀自增:j = %d, i = %d\n", j, i); // j = 6, i = 6
// 后缀自减:先使用,再减1
i = 5;
j = i--;
printf("后缀自减:j = %d, i = %d\n", j, i); // j = 5, i = 4
// 前缀自减:先减1,再使用
i = 5;
j = --i;
printf("前缀自减:j = %d, i = %d\n", j, i); // j = 4, i = 4
return 0;
}

注意事项
- 除法中的分母不能为 0,否则会导致运行错误(除零错误)。
%只能用于整数,不能用于浮点数。- 算术运算的结果类型通常遵循 整型提升规则:
int + float = float。
赋值运算符
基本赋值运算符 =
- 用于将右边的值赋给左边的变量。
int a;
a = 10; // 把10赋值给变量a
- 支持连续赋值:
int a, b, c;
a = b = c = 5; // 所有变量都赋值为5
复合赋值运算符(简写形式)
| 运算符 | 含义 | 示例 | 等价于 |
|---|---|---|---|
+= |
加后赋值 | a += 2; |
a = a + 2; |
-= |
减后赋值 | a -= 3; |
a = a - 3; |
*= |
乘后赋值 | a *= 4; |
a = a * 4; |
/= |
除后赋值 | a /= 2; |
a = a / 2; |
%= |
取余后赋值 | a %= 3; |
a = a % 3; |
示例代码
#include <stdio.h>
int main() {
int a = 10;
printf("初始值:a = %d\n", a);
a += 5;
printf("执行 a += 5 后:a = %d\n", a); // a = 15
a -= 3;
printf("执行 a -= 3 后:a = %d\n", a); // a = 12
a *= 2;
printf("执行 a *= 2 后:a = %d\n", a); // a = 24
a /= 4;
printf("执行 a /= 4 后:a = %d\n", a); // a = 6
a %= 5;
printf("执行 a %%= 5 后:a = %d\n", a); // a = 1
return 0;
}

注意事项
- 左值必须是变量,不能是常量或表达式:
5 = a; // ❌ 错误 (a + 1) = b; // ❌ 错误 - 复合赋值符号含隐式类型转换(例如浮点与整型混用):
int a = 10; a /= 3.0; // 编译器警告或截断为整数 - 可用于简化循环或累计操作:
sum += i; // 累加 count *= 2; // 指数增长
比较运算符(关系运算符)
什么是比较运算符?
比较运算符用于比较两个值之间的大小或相等关系。它的结果是一个布尔值(true 或 false),在 C 语言中用整数表示:
- 真(true) →
1 - 假(false) →
0
常见的比较运算符
| 运算符 | 含义 | 示例 | 结果说明 |
|---|---|---|---|
| == | 等于 | a == b |
若相等,结果为1 |
| != | 不等于 | a != b |
若不相等,结果为1 |
| > | 大于 | a > b |
若a大于b,结果为1 |
| < | 小于 | a < b |
若a小于b,结果为1 |
| >= | 大于或等于 | a >= b |
若a大于或等于b,为1 |
| <= | 小于或等于 | a <= b |
若a小于或等于b,为1 |
示例代码
#include <stdio.h>
int main() {
int a = 5, b = 3;
printf("a == b 的结果是:%d\n", a == b); // 0
printf("a != b 的结果是:%d\n", a != b); // 1
printf("a > b 的结果是:%d\n", a > b); // 1
printf("a < b 的结果是:%d\n", a < b); // 0
printf("a >= b 的结果是:%d\n", a >= b); // 1
printf("a <= b 的结果是:%d\n", a <= b); // 0
return 0;
}

使用场景
- 条件判断:在
if、while、for等语句中用于判断条件。
if (score >= 60) {
printf("及格\n");
}
- 判断两个值是否相等/不相等
注意事项
- ==是比较运算符,不能与赋值符号=混淆
if (a = b) // ❌ 错误:这实际上是赋值 if (a == b) // ✅ 正确:这是比较 - 比较结果是整数:用于布尔逻辑时不需要强制转为
true/false。 - 可以与逻辑运算符组合使用(如
&&,||):if (age >= 18 && age <= 60) { printf("适龄人群\n"); }
以下是整理好的 C语言逻辑运算符(逻辑判断)笔记(Markdown 格式),你可以直接用于 Obsidian、Typora 等支持 Markdown 的笔记应用。
逻辑运算符
逻辑运算符用于连接多个条件表达式,结果为“真(1)”或“假(0)”。常用于 if、while、for 等控制语句中。
逻辑运算符表
| 运算符 | 名称 | 示例 | 含义说明 |
|---|---|---|---|
&& |
逻辑与 | a > 0 && b > 0 |
两个条件都为真时结果为真 |
|| |
逻辑或 | || |
两个条件有一个为真结果为真 |
! |
逻辑非 | !a |
将真变为假,假变为真 |
优先级(从高到低)
!(逻辑非)&&(逻辑与)||(逻辑或)
逻辑表达式尽量加括号
()以避免歧义,提高可读性。
示例代码
#include <stdio.h>
int main() {
int a = 5, b = 0;
if (a > 0 && b > 0) {
printf("两个都大于0\n");
} else {
printf("至少有一个不是正数\n");
}
if (a > 0 || b > 0) {
printf("至少有一个大于0\n");
}
if (!b) {
printf("b 是假值(0),!b 为真\n");
}
return 0;
}

短路运算规则
&&:左边为假,右边不再判断||:左边为真,右边不再判断
利用短路特性可以避免无效或危险操作,例如避免除以 0:
if (b != 0 && a / b > 2) {
// 安全:b 为 0 时不会执行除法
}
常见错误
-
!a > 0实际等价于(!a) > 0,容易误解。- 推荐写法:
!(a > 0)更清晰。
- 推荐写法:
-
不要把
&和&&混用,前者是按位与,逻辑判断要用&&。
三目运算符(条件运算符)
什么是三目运算符?
三目运算符(也叫条件运算符)用于根据某个条件表达式的真假来选择两个值中的一个。其语法格式如下:
条件表达式 ? 表达式1 : 表达式2;
-
如果 条件表达式为真(非零),则执行 表达式1。
-
如果 条件表达式为假(为0),则执行 表达式2。
简单示例
int a = 5, b = 10;
int max = (a > b) ? a : b;
printf("较大值是:%d\n", max);
解释:
- 如果
a > b成立,max = a; - 否则
max = b。
与 if-else 对比
等价的 if-else 写法如下:
int max;
if (a > b) {
max = a;
} else {
max = b;
}
使用三目运算符可以让代码更简洁,适合简单条件赋值或输出。
嵌套使用示例
int a = 3, b = 5, c = 2;
int max = (a > b) ? ((a > c) ? a : c) : ((b > c) ? b : c);
上面这句代码实现的是“三个数中取最大值”,逻辑结构如下:
-
如果
a > b:- 再判断
a > c,最大是 a 或 c;
- 再判断
-
否则:
- 再判断
b > c,最大是 b 或 c。
- 再判断
注意事项
| 注意点 | 说明 |
|---|---|
| 表达式必须有返回值 | 三目运算符结果通常用作赋值或打印 |
| 不能用于复杂流程控制 | 不适合包含语句块、循环等复杂逻辑 |
| 括号可提升可读性 | 尤其嵌套使用时建议加括号 |
| 结果类型要一致或能转换 | 三目运算符两边类型不兼容会报错或隐式转换 |
典型用法总结
// 取较小值
int min = (x < y) ? x : y;
// 判断奇偶
printf("%d 是 %s数\n", n, (n % 2 == 0) ? "偶" : "奇");
// 判断字符是否为大写字母
char c = 'A';
printf("字符 %c 是 %s\n", c, (c >= 'A' && c <= 'Z') ? "大写字母" : "不是大写字母");
以下是整理好的 C语言类型转换(隐式转换与强制转换)笔记,结构清晰,格式为 Markdown,适合用于学习或归档。
类型转换(隐式转换 & 强制转换)
在 C 语言中,不同类型的数据在运算或赋值时,可能发生类型转换。类型转换有两种:
- 隐式类型转换(自动转换)
- 显式类型转换(强制转换)
隐式类型转换(自动转换)
定义
编译器自动完成的类型转换,不需要程序员手动指定。
何时发生
- 不同类型之间参与表达式运算
- 赋值时类型不一致
- 函数参数传递时
类型提升规则(从低到高)
char → short → int → unsigned int → long → float → double → long double
示例
int i = 5;
float f = 2.5;
float result = i + f; // int 自动转换为 float,再进行浮点加法
解释:i 被自动提升为 float,最终 result = 7.5
强制类型转换(显式转换)
定义
由程序员显式指定的类型转换,用来覆盖默认的隐式规则。
语法格式
(目标类型) 表达式
示例
int a = 5, b = 2;
float result = (float)a / b; // 把 a 转换为 float,结果为 2.5
解释:强制将 a 转为 float,然后 float / int → float / float,避免整型除法。
注意事项
| 项目 | 说明 |
|---|---|
| 🚫 强制转换不会改变变量原值 | 它只改变参与计算时的临时类型 |
| 🚫 强制转换不能转换结构体等复杂类型 | 只能转换基本数据类型 |
| ✅ 转换后类型参与表达式计算 | 可能影响计算结果的精度 |
| ⚠️ 精度丢失 | 将 float 强转为 int 会舍弃小数部分 |
比较示例:隐式 vs 强制
#include <stdio.h>
int main() {
int a = 5, b = 2;
// 隐式转换(整型除法)
float res1 = a / b; // 结果是 2.0,因为先是整除
// 强制转换(浮点除法)
float res2 = (float)a / b; // 结果是 2.5
printf("隐式转换结果:%f\n", res1);
printf("强制转换结果:%f\n", res2);
return 0;
}
类型转换小结表
| 类型转换方式 | 是否程序员控制 | 转换发生位置 | 是否安全 |
|---|---|---|---|
| 隐式转换 | 否(自动) | 表达式、赋值、参数 | 相对安全,易出错 |
| 强制转换 | 是 | 任意表达式前 | 更灵活,需谨慎 |
本文来自博客园,作者:ffff5,转载请注明原文链接:https://www.cnblogs.com/ffff5/p/18892205

浙公网安备 33010602011771号