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