赋值运算与自增自减
中等7赋值运算与自增自减:让变量“听话”地变化
程序里经常需要改变变量的值,比如记录游戏分数、统计排队人数、计算零花钱余额。赋值运算符就是用来给变量“装新值”的工具,而自增自减则是让变量自动加1或减1的快捷写法。学会了它们,你的代码会更简洁、更高效。
基本赋值:把值“放进盒子”
最简单的赋值是用 = 号,比如 x = 10; 就是把数字10放进变量 x 的盒子里。注意:这里的 = 不是数学上的“等于”,而是把右边的值复制一份给左边。可以看成向盒子里放入新东西,原来的旧东西被覆盖掉。
int score = 0; // 定义分数变量,初始0
score = 100; // 把100赋值给score,现在score是100
score = score + 20; // 先把score的旧值100取出来加20,再放回去 → score变成120
复合赋值:省去重复写变量名
当我们要对变量自身做加减乘除时,比如 x = x + 3,可以简写为 x += 3。这种写法叫复合赋值运算符,常见的有:
+=:加后赋值,x += 3等价于x = x + 3-=:减后赋值,x -= 2等价于x = x - 2*=:乘后赋值,x *= 4等价于x = x * 4/=:除后赋值,x /= 2等价于x = x / 2%=:取余后赋值,x %= 7等价于x = x % 7
生活例子:小明每周零花钱是50元,他花掉了8元买零食,那现在余额就是 money = money - 8,写成复合赋值就是 money -= 8,更直观。
int money = 50; // 初始零花钱50元
money += 30; // 妈妈又给了30元 → money = 80
money -= 8; // 买零食花掉8元 → money = 72
money *= 2; // 爸爸说考100分奖励翻倍 → money = 144
money /= 3; // 和两个朋友平分花费 → money = 48 (整数除法)
cout << "现在有 " << money << " 元" << endl; // 输出48
自增与自减:让变量“自动”走一步
想让变量加1或减1,最直接的写法是 x = x + 1 或 x = x - 1。但C++提供了更简短的运算符:
x++或++x:把 x 增加1(自增)x--或--x:把 x 减少1(自减)
它们有两种形式:后缀(x++)和前缀(++x)。区别在于什么时候改变变量的值:
| 写法 | 执行顺序 | 例子 |
|---|---|---|
x++(后缀) | 先使用 x 的当前值,然后 x 加 1 | int b = a++; → b得到a原来的值,a再增加 |
++x(前缀) | 先把 x 加 1,然后使用新值 | int c = ++a; → a先增加,c得到新值 |
生活例子:排队时,队伍人数 people 每来一个人就加1。如果记下“现在的人数”叫 now:
- 后缀:
now = people++;意思是“先记录当前人数,然后再来一个人”,所以 now 记录的是加人之前的人数。 - 前缀:
now = ++people;意思是“先来一个人,再记录现在的人数”,所以 now 记录的是加人之后的人数。
int a = 5; // a初始5
int b = a++; // 后缀:b先得到5,然后a变成6
cout << "a = " << a << ", b = " << b << endl; // a=6, b=5
int c = ++a; // 前缀:a先变成7,然后c得到7
cout << "a = " << a << ", c = " << c << endl; // a=7, c=7
记住:单独写 a++; 或 ++a; 效果完全一样(都是让 a 加 1),区别只在表达式里的使用顺序。
新手容易犯的三个错误
错误1:把 = 和 == 搞混
= 是赋值,== 是判断是否相等。写条件时容易写成 if (x = 5),这会把5赋值给x,而且条件永远为真(因为赋值表达式的值就是5,非0即真)。正确写法:if (x == 5)。
错误2:在同一个表达式里多次修改同一个变量
比如 x = x++ + ++x; 这种写法在不同编译器里结果可能不同,属于“未定义行为”。建议:不要在一句话里对同一个变量多次自增自减,拆开写清楚。
错误3:忘记复合赋值与普通赋值的等价关系
x *= y + 2 等价于 x = x * (y + 2),不是 x = x * y + 2。因为复合赋值运算符的优先级低于乘除,但高于逗号,所以要特别注意括号。
int x = 10, y = 3;
x *= y + 2; // 等价于 x = x * (y + 2) = 10 * 5 = 50
// 如果写 x = x * y + 2 则等于 10*3+2 = 32,不一样!
完整可运行示例:模拟考试成绩变化
下面的程序模拟一个学生考试后的分数变化,展示赋值、复合赋值和自增自减的使用。
#include <iostream>
using namespace std;
int main() {
int score = 60; // 初始成绩60分
cout << "初始成绩: " << score << endl;
// 老师加了5分平时分
score += 5; // score = 65
cout << "平时分+5后: " << score << endl;
// 因为作弊被扣了3分
score -= 3; // score = 62
cout << "扣分后: " << score << endl;
// 老师决定翻倍奖励积极发言
score *= 2; // score = 124
cout << "翻倍后: " << score << "(但满分100!)" << endl;
// 改正:重新赋值
score = 100; // 直接设为满分
cout << "改为满分: " << score << endl;
// 模拟自增:每答对一题加1分
int answerCorrect = 0; // 答对的题数
cout << "\n开始答题..." << endl;
answerCorrect++; // 第一题答对
cout << "答对第一题,题数: " << answerCorrect << endl;
answerCorrect++; // 第二题答对
cout << "答对第二题,题数: " << answerCorrect << endl;
// 演示前缀后缀区别
int n = 10; // 初始人数
cout << "\n演示前缀后缀:" << endl;
cout << "n初始值: " << n << endl;
n += 5;
cout << "n += 5 后: " << n << endl;
cout << "n++ = " << n++ << " (此时n = " << n << ")" << endl;
cout << "++n = " << ++n << " (此时n = " << n << ")" << endl;
return 0;
}
运行结果(注释说明执行顺序):
初始成绩: 60
平时分+5后: 65
扣分后: 62
翻倍后: 124(但满分100!)
改为满分: 100
开始答题...
答对第一题,题数: 1
答对第二题,题数: 2
演示前缀后缀:
n初始值: 10
n += 5 后: 15
n++ = 15 (此时n = 16) // 先输出15,然后n变为16
++n = 17 (此时n = 17) // n先变为17,再输出17
相关知识点指引
掌握了赋值和自增自减,下一步可以学习:
- 运算符优先级:弄懂
*=、++和其他运算符谁先算,避免踩坑。 for循环:循环里经常用i++来计数,是自增的经典应用。- 输入输出:用
cin读取变量值,结合赋值运算处理数据。 - 关系运算符:
==、!=、<、>等,用来比较变量值,常与控制结构(if、while)配合使用。
赋值运算和自增自减是C++编程的“基本动作”,就像走路一样简单但必须熟练。多写几行代码,自然就能分清前缀后缀,轻松驾驭变量的变化。
例题精讲
在C++中,执行以下代码后,变量a和b的值分别是多少?\nint a = 5;\nint b = a++ + ++a;
下列选项中,不能将变量x的值增加3的语句是?
在C++中,语句“int a = 5, b = a--;”执行后,a和b的值分别为4和5。
以下程序实现变量b取变量a的值,然后将a自增1。请补充完整。\nint a = 10;\nint b = ___;以下代码段执行后,最终输出结果为:0 1 0。请补充循环体中的语句。\nint x = 0;\nfor(int i = 0; i < 2; i++) {\n cout << ___ << " ";\n}