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;
}

注意事项

  1. 左值必须是变量,不能是常量或表达式:
    5 = a;      // ❌ 错误
    (a + 1) = b; // ❌ 错误
    
  2. 复合赋值符号含隐式类型转换(例如浮点与整型混用):
    int a = 10;
    a /= 3.0; // 编译器警告或截断为整数
    
  3. 可用于简化循环或累计操作:
    sum += i; // 累加
    count *= 2; // 指数增长
    

比较运算符(关系运算符)

什么是比较运算符?

比较运算符用于比较两个值之间的大小或相等关系。它的结果是一个布尔值(truefalse),在 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;
}

使用场景

  • 条件判断:在 ifwhilefor 等语句中用于判断条件。
if (score >= 60) {
    printf("及格\n");
}
  • 判断两个值是否相等/不相等

注意事项

  1. ==是比较运算符,不能与赋值符号=混淆
    if (a = b)  // ❌ 错误:这实际上是赋值
    if (a == b) // ✅ 正确:这是比较
    
  2. 比较结果是整数:用于布尔逻辑时不需要强制转为 true/false
  3. 可以与逻辑运算符组合使用(如 &&, ||):
    if (age >= 18 && age <= 60) {
        printf("适龄人群\n");
    }
    

以下是整理好的 C语言逻辑运算符(逻辑判断)笔记(Markdown 格式),你可以直接用于 Obsidian、Typora 等支持 Markdown 的笔记应用。


逻辑运算符

逻辑运算符用于连接多个条件表达式,结果为“真(1)”或“假(0)”。常用于 ifwhilefor 等控制语句中。


逻辑运算符表

运算符 名称 示例 含义说明
&& 逻辑与 a > 0 && b > 0 两个条件都为真时结果为真
|| 逻辑或 || 两个条件有一个为真结果为真
! 逻辑非 !a 将真变为假,假变为真

优先级(从高到低)

  1. !(逻辑非)
  2. &&(逻辑与)
  3. ||(逻辑或)

逻辑表达式尽量加括号 () 以避免歧义,提高可读性。

示例代码

#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 语言中,不同类型的数据在运算或赋值时,可能发生类型转换。类型转换有两种:

  1. 隐式类型转换(自动转换)
  2. 显式类型转换(强制转换)

隐式类型转换(自动转换)

定义

编译器自动完成的类型转换,不需要程序员手动指定。

何时发生

  • 不同类型之间参与表达式运算
  • 赋值时类型不一致
  • 函数参数传递时

类型提升规则(从低到高)

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 / intfloat / 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;
}

类型转换小结表

类型转换方式 是否程序员控制 转换发生位置 是否安全
隐式转换 否(自动) 表达式、赋值、参数 相对安全,易出错
强制转换 任意表达式前 更灵活,需谨慎
posted @ 2025-05-22 23:34  ffff5  阅读(146)  评论(0)    收藏  举报