C语言基础学习-二、运算符

目录

1、算术运算符

基本算术运算符

数值拆分示例

2、自增自减运算符

基本用法

[⚠️ 重要警告:未定义行为](#⚠️ 重要警告:未定义行为)

正确写法

练习题(安全写法)

3、赋值运算符

基本赋值

连续赋值

4、关系运算符

关系运算符表

注意事项

5、逻辑运算符

逻辑运算符表

短路特性

实际应用示例

6、三元运算符(条件运算符/三目运算符)

基本语法

示例

7、逗号运算符

基本用法

示例

8、运算符优先级(完整表格)

优先级总表(从高到低)

记忆口诀

实用示例


1、算术运算符

基本算术运算符

运算符 名称 示例 说明
+ 加法 a + b 两数相加
- 减法 a - b 两数相减
* 乘法 a * b 两数相乘
/ 除法 a / b 两数相除(整数除法会截断小数)
% 取模/取余 a % b 求余数(只能用于整数)

数值拆分示例

cpp 复制代码
// 数值拆分
printf("请输入一个三位数:\n");
int num;
scanf("%d", &num);  // 注意:&num 前面是英文逗号

// 拆分各位数字
int ge = num % 10;        // 个位
int shi = num / 10 % 10;  // 十位
int bai = num / 100;      // 百位(三位数不需要再%10)

printf("个位:%d, 十位:%d, 百位:%d\n", ge, shi, bai);

⚠️ 注意

  • scanf 参数之间用英文逗号分隔
  • 三位数的百位直接 num / 100 即可,不需要 % 10

2、自增自减运算符

基本用法

运算符 名称 说明 示例
++i 前缀自增 先自增,后使用 i=10; j=++i;i=11, j=11
i++ 后缀自增 先使用,后自增 i=10; j=i++;i=11, j=10
--i 前缀自减 先自减,后使用 i=10; j=--i;i=9, j=9
i-- 后缀自减 先使用,后自减 i=10; j=i--;i=9, j=10

⚠️ 重要警告:未定义行为

以下写法是未定义行为(Undefined Behavior),不同编译器可能产生不同结果!

cpp 复制代码
// ❌ 错误示范 - 未定义行为
int i = 10;
int k = i++ + ++i - --j - i--;  // 不要这样写!

原因:在同一个表达式中对同一变量进行多次修改,C标准未定义其行为顺序。

正确写法

cpp 复制代码
// ✅ 正确示范 - 分开写
int i = 10;
int j = 5;
int temp1 = i++;  // temp1=10, i=11
int temp2 = ++i;  // i=12, temp2=12
int temp3 = --j;  // j=4, temp3=4
int temp4 = i--;  // temp4=12, i=11
int k = temp1 + temp2 - temp3 - temp4;  // k = 10+12-4-12 = 6

练习题(安全写法)

cpp 复制代码
// 练习1:后缀自增
int a = 10;
int k1 = a++;  // k1=10, a=11
k1 = k1 + a++; // k1=10+11=21, a=12
k1 = k1 + a;   // k1=21+12=33

// 练习2:前缀自增
int b = 10;
int k2 = ++b;  // b=11, k2=11
k2 = k2 + ++b; // b=12, k2=11+12=23
k2 = k2 + b;   // k2=23+12=35

// 练习3:混合使用(分开计算)
int c = 10;
int temp1 = ++c;  // c=11, temp1=11
int temp2 = c++;  // temp2=11, c=12
int k3 = temp1 + temp2 + c;  // k3=11+11+12=34

3、赋值运算符

基本赋值

运算符 说明 示例 等价于
= 赋值 a = 5 -
+= 加后赋值 a += 5 a = a + 5
-= 减后赋值 a -= 5 a = a - 5
*= 乘后赋值 a *= 5 a = a * 5
/= 除后赋值 a /= 5 a = a / 5
%= 取模后赋值 a %= 5 a = a % 5

连续赋值

cpp 复制代码
int x, y;
x = y = 1;  // 结合性:从右往左
// 等价于:x = (y = 1);
// 执行顺序:先 y=1,再 x=y(即x=1)

4、关系运算符

关系运算符表

运算符 名称 示例 说明
> 大于 a > b a大于b时返回1(真),否则返回0(假)
< 小于 a < b a小于b时返回1,否则返回0
>= 大于等于 a >= b a大于等于b时返回1,否则返回0
<= 小于等于 a <= b a小于等于b时返回1,否则返回0
== 等于 a == b a等于b时返回1,否则返回0
!= 不等于 a != b a不等于b时返回1,否则返回0

注意事项

cpp 复制代码
// ⚠️ 常见错误:用 = 代替 ==
if (a = 5)   // ❌ 这是赋值,不是比较!
if (a == 5)  // ✅ 这是比较

// 关系运算的结果是整数:1表示真,0表示假
int result = (5 > 3);  // result = 1

5、逻辑运算符

逻辑运算符表

运算符 名称 示例 说明
! 逻辑非 !a a为真时返回0,a为假时返回1
&& 逻辑与 a && b a和b都为真时返回1,否则返回0
|| 逻辑或 a || b 两边都为假才是假

短路特性

cpp 复制代码
// && 短路:左边为假,右边不执行
int a = 0, b = 5;
if (a > 1 && ++b > 0) {  // a>1为假,++b不执行
    // ...
}
printf("b = %d\n", b);  // b = 5(未自增)

// || 短路:左边为真,右边不执行
int c = 1, d = 5;
if (c > 0 || ++d > 0) {  // c>0为真,++d不执行
    // ...
}
printf("d = %d\n", d);  // d = 5(未自增)

实际应用示例

cpp 复制代码
// 判断一个两位数是否不含7且不能被7整除
int number;
printf("请输入一个两位数:\n");
scanf("%d", &number);  //&number前是英文逗号

int ge = number % 10;
int shi = number / 10;

// 个位不是7 且 十位不是7 且 不能被7整除
int result = (ge != 7) && (shi != 7) && (number % 7 != 0);
printf("结果:%d\n", result);  // 1表示符合条件,0表示不符合

6、三元运算符(条件运算符/三目运算符)

基本语法

cpp 复制代码
条件表达式 ? 表达式1 : 表达式2
  • 执行逻辑:如果条件为真,返回表达式1的值;否则返回表达式2的值
  • 结合性:从右往左

示例

cpp 复制代码
// 求两个数的最大值
int a = 10, b = 20;
int max = (a > b) ? a : b;  // max = 20

// 判断奇偶
int num = 7;
char *result = (num % 2 == 0) ? "偶数" : "奇数";

// 嵌套三元运算符
int score = 85;
char *grade = (score >= 90) ? "A" : 
              (score >= 80) ? "B" : 
              (score >= 70) ? "C" : "D";

7、逗号运算符

基本用法

场景 说明 示例
分隔符 分隔变量声明、函数参数等 int a, b, c;
运算符 从左到右依次执行,返回最后一个表达式的值 a = (b=3, b+2);

示例

cpp 复制代码
// 逗号作为分隔符
int a, b, c;  // 声明多个变量
printf("%d, %d, %d\n", a, b, c);  // 分隔函数参数

// 逗号作为运算符
int i;
i = (3, 4, 5);  // i = 5(返回最后一个表达式的值)

// for循环中的典型应用
for (int i = 0, j = 10; i < j; i++, j--) {
    printf("%d %d\n", i, j);
}

// ❌ 错误写法
// int i, i = 3, i++, ++i, i + 5;  // 这是非法语法!

// ✅ 正确写法
int i = 3;
i++;
++i;
int result = i + 5;

8、运算符优先级(完整表格)

优先级总表(从高到低)

优先级 运算符 名称 结合性
1 () [] -> . 括号、数组下标、成员访问 左→右
2 ++ -- + - ! ~ * & (类型) sizeof 一元运算符 右→左
3 * / % 乘、除、取模 左→右
4 + - 加、减 左→右
5 << >> 左移、右移 左→右
6 > < >= <= 关系运算符 左→右
7 == != 等于、不等于 左→右
8 & 按位与 左→右
9 ^ 按位异或 左→右
10 ` ` 按位或
11 && 逻辑与 左→右
12 ` `
13 ?: 三元运算符 右→左
14 = += -= *= /= %= 赋值运算符 右→左
15 , 逗号运算符 左→右

记忆口诀

cpp 复制代码
括号成员第一级,一元运算符第二
乘除取模第三位,加减紧随其后边
移位运算排第五,关系运算第六位
等于不等到第七,按位与或异或中
逻辑与来逻辑或,三元赋值逗号尾

实用示例

cpp 复制代码
// 示例1:算术 > 关系 > 逻辑
int a = 5, b = 10, c = 15;
int result = a + b > c && b < c;  // (5+10)>15 && 10<15 → 0 && 1 → 0

// 示例2:括号改变优先级
int x = (2 + 3) * 4;  // x = 20(不是 2+3*4=14)

// 示例3:逻辑运算符优先级 ! > && > ||
int flag = !a || b && c;  // 等价于 (!a) || (b && c)

// 示例4:赋值运算符优先级最低
int a, b, c;
a = b = c = 5;  // 从右往左:c=5, b=c, a=b
相关推荐
想放学的刺客1 小时前
整理了120道单片机嵌入式面试题与答案,覆盖了硬件电路和C语言等核心领域。
c语言·c++·stm32·单片机·嵌入式硬件·mcu·51单片机
yangSimaticTech2 小时前
沿触发的4个问题
开发语言·制造
weixin_458872612 小时前
东华复试OJ每日3题打卡·复盘91~93
学习
hqyjzsb2 小时前
企业AI人才库的搭建体系与长效运营管理方案
人工智能·学习·职场和发展·创业创新·学习方法·业界资讯·改行学it
舟舟亢亢2 小时前
算法总结——二叉树【hot100】(上)
java·开发语言·算法
百锦再2 小时前
Java中的char、String、StringBuilder与StringBuffer 深度详解
java·开发语言·python·struts·kafka·tomcat·maven
星辰徐哥3 小时前
C语言网络编程入门:socket编程、TCP/IP协议、客户端与服务器通信的实现
c语言·网络·tcp/ip
普通网友3 小时前
多协议网络库设计
开发语言·c++·算法
努力努力再努力wz3 小时前
【Linux网络系列】:TCP 的秩序与策略:揭秘传输层如何从不可靠的网络中构建绝对可靠的通信信道
java·linux·开发语言·数据结构·c++·python·算法