// 数值拆分
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;
// 示例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