CC++ & Algorithm

自增自减运算符:给数字加1或减1的快捷方式

中等41
语言版本:C++Python
概述:自增运算符++可以让变量加1,自减运算符--可以让变量减1,写代码时方便又快速。

自增自减运算符:给变量加1或减1的快捷方法

在编写程序时,我们经常需要让一个数增加1或减少1。比如数数:从第1个到第2个、第3个……每次加1;或者倒计时:从10到9、8……每次减1。如果每次都写 count = count + 1 或者 count = count - 1,虽然没错,但有点啰嗦。C++专门提供了两个“一键操作”的运算符:++(自增)和 --(自减)。它们就像游戏里的“加1按钮”和“减1按钮”,按一下变量就自动加1或减1。

这两个运算符非常常用,尤其在循环、计数器、统计中几乎每天都会用到。但要注意,它们有“前置”和“后置”两种写法,用起来效果不一样,容易搞混。下面我们就来仔细拆解。


1. 什么是自增(++)和自减(--)?

  • 自增 ++:让变量的值增加1,等价于 变量 = 变量 + 1
  • 自减 --:让变量的值减少1,等价于 变量 = 变量 - 1

它们只能用在 变量 上,不能用在常量和表达式上(比如 5++(a+b)++ 是错误的)。

使用格式很简单:

int score = 90;   // 初始分数90分
score++;          // 分数变成91
score--;          // 分数变回90

2. 前置和后置:先做还是先用?

自增和自减都有两种写法:前置++变量--变量)和 后置变量++变量--)。它们的 最终效果 都是让变量加1或减1,但是 表达式的值(也就是把这个式子当做一个整体使用时得到的数值)不同。

前置:先改变,再使用
  • ++变量:先把变量加1,然后返回新值。
  • --变量:先把变量减1,然后返回新值。

想象你有一个存钱罐,里面有5块钱。
前置自增:先往里面塞1块钱(变成6块),然后拿出这6块钱去买零食。你拿到的是加1后的钱。

后置:先使用,再改变
  • 变量++:先返回变量的当前值,然后变量再加1。
  • 变量--:先返回变量的当前值,然后变量再减1。

还是那个存钱罐,里面有5块钱。
后置自增:先拿出5块钱去买零食(你拿到的是加1前的5块),然后再往里面塞1块钱(变成6块)。你拿到的是加1前的钱。

下面用代码演示:

#include <iostream>
using namespace std;

int main() {
    int apple = 5;   // 苹果数量初始5个
    int orange = 5;  // 橙子数量初始5个

    // 前置自增
    int box1 = ++apple;  // apple先变成6,再把6赋给box1
    cout << "前置自增后 apple=" << apple << ", box1=" << box1 << endl;

    // 后置自增
    int box2 = orange++; // 先把orange的值5赋给box2,然后orange变成6
    cout << "后置自增后 orange=" << orange << ", box2=" << box2 << endl;

    // 自减也是一样
    int score = 10;        // 初始分数10
    cout << "前置自减: " << --score << endl;  // score先变成9,输出9
    cout << "后置自减: " << score-- << endl;  // 先输出9,然后score变成8
    cout << "最后score的值: " << score << endl; // 输出8

    return 0;
}

运行结果:

前置自增后 apple=6, box1=6
后置自增后 orange=6, box2=5
前置自减: 9
后置自减: 9
最后score的值: 8

关键点:如果只是单纯让变量加1,不关心表达式的值(比如单独写一行 i++;),那么前置和后置效果完全一样。只有在把表达式的结果赋给另一个变量、作为函数参数、或用在复杂表达式里时,区别才显现出来。


3. 生活中的例子帮你理解

例子1:排队领奖品

小朋友排队领奖品,第一个人领完后,队伍往前移动一位。

  • 前置自增相当于:先让队伍往前移动一步(人数+1),然后让新位置的人领奖品。
  • 后置自增相当于:先让当前位置的人领奖品,然后队伍往前移动一步。

例子2:考试加分

你考了90分,老师说要给你加1分作为鼓励。

  • 如果老师用 ++score:先改成91分,然后告诉你 “你现在的分数是91”。
  • 如果老师用 score++:先告诉你 “你的分数是90”,然后再改成91分。最后分数都是91,但中间听到的话不一样。

4. 新手常犯的错误

错误1:误把前置后置用在常量上
// 错误代码
int a = 5;
int b = a+++;   // 语法错误,多了一个+
cout << (5++) ; // 错误,5是常量,不能自增
错误2:在同一个表达式中对同一个变量多次自增/自减
int x = 3;
int y = x++ + x++; // 结果不确定!不同编译器可能不同

这叫 未定义行为,非常危险。永远不要在一个表达式里对同一个变量多次使用 ++--

错误3:混淆前置后置导致逻辑错误

例如想统计经过了多少次,却错误地用了前置:

int count = 0;
while (count < 5) {
    cout << "这是第" << ++count << "次" << endl; // 输出1,2,3,4,5 没问题
}
// 但如果你想让 count 从1开始处理,却写成 count++,就会先输出0

另一种常见错误:在判断条件里误用:

int n = 0;
if (n++) { // 先把n=0作为判断,因为0是false,所以不会进入,然后n变成1
    cout << "进来了" << endl;
}
// 很多新手以为n>0就会进来,结果没进来,因为先判断了0

通常建议:如果只是想让变量加1,单独写一行,不要嵌套在复杂的表达式里。例如:

// 好习惯
i++;  // 单独一行,简单明了
// 而不是
if (i++ > 5) // 容易混淆
错误4:忘记自增自减运算符优先级

++-- 的优先级很高(仅次于括号、成员访问等),比 +*、赋值 = 都要高。例如:

int a = 3;
int b = ++a * 2; // 相当于 (++a) * 2,a先变成4,再乘2,b=8
int c = a++ * 2; // 相当于 (a++) * 2,a先把3拿出去乘2得6,然后a变成4,c=6

懂得优先级可以帮你写出正确代码,但建议用括号让意图更清晰。


5. 完整可运行示例:模拟游戏得分

下面是一个模拟游戏得分的程序,展示自增自减的典型用法。

#include <iostream>
using namespace std;

int main() {
    int score = 0;     // 初始分数0
    int level = 1;     // 初始等级1

    // 打怪一次加10分,升级一次等级+1
    cout << "击败小怪兽!" << endl;
    score = score + 10;   // 也可以用 score += 10;
    cout << "当前分数:" << score << endl;

    cout << "击败BOSS!获得额外奖励,等级提升!" << endl;
    level++;              // 后置自增,等级从1变成2
    cout << "当前等级:" << level << endl;

    // 连杀特效:连续击败3个小怪,每次分数+10,使用前置自增
    int killCount = 0;   // 击败次数
    cout << "连杀开始!" << endl;
    ++killCount;         // 第1次击败
    score += 10;
    cout << "第" << killCount << "次击败,分数:" << score << endl;

    ++killCount;         // 第2次
    score += 10;
    cout << "第" << killCount << "次击败,分数:" << score << endl;

    ++killCount;         // 第3次
    score += 10;
    cout << "第" << killCount << "次击败,分数:" << score << endl;

    // 显示最终结果
    cout << "\n最终分数:" << score << ",等级:" << level << endl;

    // 这里演示前置后置的区别(用于赋值)
    int a = 5, b = 5;
    int result1 = ++a;   // a先变成6,result1=6
    int result2 = b++;   // b先给result2=5,然后b变成6
    cout << "前置自增赋值:a=" << a << ",result1=" << result1 << endl;
    cout << "后置自增赋值:b=" << b << ",result2=" << result2 << endl;

    return 0;
}

运行结果(示例):

击败小怪兽!
当前分数:10
击败BOSS!获得额外奖励,等级提升!
当前等级:2
连杀开始!
第1次击败,分数:20
第2次击败,分数:30
第3次击败,分数:40

最终分数:40,等级:2
前置自增赋值:a=6,result1=6
后置自增赋值:b=6,result2=5

6. 相关知识点指引

  • for循环:最常用的自增场景,比如 for (int i = 0; i < 10; i++)i++ 就是后置自增,用于每次循环后计数加1。
  • 赋值运算符+=-= 也可以实现加1或减1,如 x += 1; 效果等同于 x++;,但 ++ 写法更简洁。
  • 复合表达式优先级:了解运算符优先级表格,避免混淆。
  • 前缀++和后缀++的性能:对于内置类型(int、double等)没有区别,但对于自定义类(比如迭代器),前置 ++ 通常效率更高(因为后置需要保存旧值)。不过作为初学者,目前只需记住两者的功能区别。

掌握了自增自减,你写循环、计数器、游戏分数、倒计时等功能时会方便很多。多写几行代码试试,很快就能熟悉它们的用法!

例题精讲

1单选题

在C++中,执行 int a = 5; a++; 后,a的值是多少?

A4
B5
C6
D7
2单选题

若有 int x = 10; --x; 则x的最终值是?

A8
B9
C10
D11
3判断题

在C++中,语句 int i = 3; i++; 和 ++i; 的效果完全相同,都会使i的值变为4。

4填空题
补全代码,使程序输出:num = 6\nint num = 5;\n___;   // 为num加1\ncout << "num = " << num << endl;
5填空题
补全代码,使count从10减少到9:\nint count = 10;\n___;   // 减1操作\ncout << count;