C&C++快速入门
8、算术运算符
1、课程目标
- 掌握C/C++中所有算术运算符
- 理解运算符优先级和结合性
- 掌握自增自减运算符的细节
- 了解整数除法和取模运算的特点
2、名词解释
| 术语 | 符号 | 说明 |
|---|---|---|
| 加法 | + | 两数相加 |
| 减法 | - | 两数相减或取负 |
| 乘法 | * | 两数相乘 |
| 除法 | / | 两数相除 |
| 取模 | % | 取余数 |
| 自增 | ++ | 变量加1 |
| 自减 | – | 变量减1 |
| 前缀 | ++x/–x | 先运算后使用 |
| 后缀 | x++/x– | 先使用后运算 |
| 复合赋值 | +=,-=等 | 运算同时赋值 |
3、代码实现
1. 基础算术运算
#include <stdio.h>
int main() {
printf("=== 算术运算符 ===\n\n");
int a = 17, b = 5;
// 基本运算
printf("【基本运算】 a=%d, b=%d\n", a, b);
printf("a + b = %d\n", a + b); // 22
printf("a - b = %d\n", a - b); // 12
printf("a * b = %d\n", a * b); // 85
printf("a / b = %d\n", a / b); // 3 (整数除法,截断小数部分)
printf("a %% b = %d\n", a % b); // 2 (取模/取余数)
// 负数取模
printf("\n【负数取模】\n");
printf("-17 %% 5 = %d\n", -17 % 5); // -2
printf("17 %% -5 = %d\n", 17 % -5); // 2
printf("-17 %% -5 = %d\n", -17 % -5); // -2
printf("规则:结果符号与被除数相同\n");
// 浮点数除法
printf("\n【浮点除法】\n");
double fa = 17.0, fb = 5.0;
printf("17.0 / 5.0 = %.4f\n", fa / fb); // 3.4000
printf("17 / 5.0 = %.4f\n", a / fb); // 3.4000 (自动类型提升)
return 0;
}
2. 自增自减运算符
#include <stdio.h>
int main() {
printf("=== 自增自减运算符 ===\n\n");
int x = 5;
// 前缀与后缀的区别
printf("【前缀vs后缀】\n");
x = 5;
printf("x = %d\n", x); // 5
printf("x++ = %d\n", x++); // 5 (先使用后加1)
printf("x = %d\n", x); // 6
printf("++x = %d\n", ++x); // 7 (先加1后使用)
printf("x = %d\n", x); // 7
// 在表达式中使用
printf("\n【在表达式中使用】\n");
int a = 5, b = 5;
int result1 = a++ * 2; // 5 * 2 = 10, 然后a变6
int result2 = ++b * 2; // b变6, 6 * 2 = 12
printf("a++ * 2 = %d, a = %d\n", result1, a);
printf("++b * 2 = %d, b = %d\n", result2, b);
// 在数组索引中使用
printf("\n【在数组中使用】\n");
int arr[5] = {10, 20, 30, 40, 50};
int i = 0;
printf("arr[i++] = %d, i = %d\n", arr[i++], i); // arr[0]=10, i=1
printf("arr[++i] = %d, i = %d\n", arr[++i], i); // arr[2]=30, i=2
return 0;
}
3. 复合赋值运算符
#include <stdio.h>
int main() {
printf("=== 复合赋值运算符 ===\n\n");
int x = 10;
printf("初始 x = %d\n\n", x);
x += 5; // x = x + 5
printf("x += 5 -> x = %d\n", x); // 15
x -= 3; // x = x - 3
printf("x -= 3 -> x = %d\n", x); // 12
x *= 2; // x = x * 2
printf("x *= 2 -> x = %d\n", x); // 24
x /= 4; // x = x / 4
printf("x /= 4 -> x = %d\n", x); // 6
x %= 4; // x = x % 4
printf("x %%= 4 -> x = %d\n", x); // 2
// 位运算复合赋值
printf("\n【位运算复合赋值】\n");
x = 0b1100; // 12
printf("初始 x = %d (0b1100)\n", x);
x &= 0b1010; printf("x &= 0b1010 -> x = %d\n", x); // 8
x |= 0b0101; printf("x |= 0b0101 -> x = %d\n", x); // 13
x ^= 0b1111; printf("x ^= 0b1111 -> x = %d\n", x); // 2
x <<= 2; printf("x <<= 2 -> x = %d\n", x); // 8
x >>= 1; printf("x >>= 1 -> x = %d\n", x); // 4
return 0;
}
4. 运算符优先级
#include <stdio.h>
int main() {
printf("=== 运算符优先级 ===\n\n");
// 优先级示例
int result;
// * / % 高于 + -
result = 2 + 3 * 4; // 2 + 12 = 14
printf("2 + 3 * 4 = %d\n", result);
result = (2 + 3) * 4; // 5 * 4 = 20
printf("(2 + 3) * 4 = %d\n", result);
// 同级从左到右
result = 20 / 4 * 2; // 5 * 2 = 10
printf("20 / 4 * 2 = %d\n", result);
result = 20 / (4 * 2); // 20 / 8 = 2
printf("20 / (4 * 2) = %d\n", result);
// 复杂表达式
int a = 5, b = 3, c = 2;
result = a + b * c - a / c; // 5 + 6 - 2 = 9
printf("%d + %d * %d - %d / %d = %d\n", a, b, c, a, c, result);
printf("\n【优先级表(从高到低)】\n");
printf("1. () [] -> . \n");
printf("2. ! ~ ++ -- + - * & sizeof\n");
printf("3. * / %% \n");
printf("4. + - \n");
printf("5. << >> \n");
printf("6. < <= > >= \n");
printf("7. == != \n");
printf("8. & \n");
printf("9. ^ \n");
printf("10. | \n");
printf("11. && \n");
printf("12. || \n");
printf("13. ?: \n");
printf("14. = += -= 等 \n");
printf("15. , \n");
return 0;
}
5、课后作业
5.1、作业1:分离各位数字
给定一个三位数,使用 / 和 % 分离出百位、十位、个位。
5.2、作业2:确定输出
分析以下代码的输出:
int a = 3, b = 4;
int c = a++ + ++b;
printf("%d %d %d", a, b, c);
5.3、作业3:实现四则运算
实现一个安全的除法函数,处理除零情况:
BOOL SafeDivide(int a, int b, int* result);