目录
[1. 概述](#1. 概述)
[2. 常用的算术赋值运算符](#2. 常用的算术赋值运算符)
[3. 示例代码](#3. 示例代码)
[4. 注意事项](#4. 注意事项)
[4.1 优先级与结合性](#4.1 优先级与结合性)
[4.2 表达式的整体性](#4.2 表达式的整体性)
[4.3 数据类型匹配](#4.3 数据类型匹配)
[4.4 与自增/自减的区别](#4.4 与自增/自减的区别)
[4.5 效率考虑](#4.5 效率考虑)
[5. 常见错误](#5. 常见错误)
[6. 小结](#6. 小结)
[7. 练习(自测)](#7. 练习(自测))
1. 概述
算术赋值运算是一种复合赋值运算符,它将算术运算和赋值操作合并在一起,使代码更简洁、易读。基本形式为:
cs
变量 算术赋值运算符 表达式;
等价于:
cs
变量 = 变量 运算符 (表达式);
注意:右侧的表达式作为一个整体先计算,再与左边的变量进行算术运算,最后将结果赋给左边的变量。
2. 常用的算术赋值运算符
| 运算符 | 名称 | 示例 | 等价于 |
|---|---|---|---|
+= |
加赋值 | a += b; |
a = a + b; |
-= |
减赋值 | a -= b; |
a = a - b; |
*= |
乘赋值 | a *= b; |
a = a * b; |
/= |
除赋值 | a /= b; |
a = a / b; |
%= |
取余赋值 | a %= b; |
a = a % b; |
3. 示例代码
cs
return 0; }
c
#include <stdio.h>
int main() {
int a = 10, b = 3;
a += b; // a = a + b → 13
printf("a += b: %d\n", a); // 13
a -= b; // a = a - b → 10(此时 a 是 13,减 3 得 10)
printf("a -= b: %d\n", a); // 10
a *= b; // a = a * b → 30(10 * 3)
printf("a *= b: %d\n", a); // 30
a /= b; // a = a / b → 10(30 / 3,整数除法)
printf("a /= b: %d\n", a); // 10
a %= b; // a = a % b → 1(10 % 3)
printf("a %%= b: %d\n", a); // 1
输出:
cs
a += b: 13
a -= b: 10
a *= b: 30
a /= b: 10
a %= b: 1
4. 注意事项
4.1 优先级与结合性
-
算术赋值运算符的优先级低于 算术运算符(
+、-、*、/、%),但高于逗号运算符。 -
结合性为从右向左(右结合)。
-
例如:
a *= b + c;等价于a = a * (b + c);,因为b + c先计算。
4.2 表达式的整体性
右侧的表达式作为一个整体参与运算,因此括号可以省略,但建议在复杂表达式中加上括号以提高可读性:
c
cs
x *= y + z; // 等价于 x = x * (y + z);
// 不要误解为 x = x * y + z;
4.3 数据类型匹配
-
运算结果会自动转换为左边变量的类型(遵循赋值类型转换规则)。
-
若两边类型不一致,可能发生截断或精度损失。
c
cs
int i = 5;
double d = 2.5;
i += d; // i 最终为 7(double 转 int,小数部分丢失)
4.4 与自增/自减的区别
算术赋值是二元操作,而自增/自减(++/--)是一元操作,不要混淆:
c
cs
a += 1; // 等价于 a = a + 1,与 a++ 效果相同,但 a++ 是后自增,表达式的值不同
4.5 效率考虑
某些编译器可能将算术赋值优化为更高效的机器指令(例如直接修改内存中的值),但在现代编译器中差异通常不大。主要优点是代码简洁。
5. 常见错误
-
忘记算术赋值运算符是一个整体,写成
a =+ b;(这是将b赋给a,相当于a = (+b);,并非加赋值)。 -
在
/=和%=中,右侧表达式为零时会导致运行时错误(除零异常)。 -
误以为
a *= b + c;是先乘后加,实际是先加后乘。
6. 小结
算术赋值运算符让代码更紧凑,同时保持了可读性。掌握它们的使用和优先级规则,能帮助写出更简洁的C程序。熟记五种运算符:+=、-=、*=、/=、%=,并理解其展开形式即可。
7. 练习(自测)
-
已知
int x = 4, y = 3;执行x *= y + 2;后,x的值是多少? -
写出
a /= b - c;的等价展开式。 -
判断:
a %= 2;等价于a = a % 2;吗?
答案:
-
x *= y + 2→x = x * (y+2) = 4 * 5 = 20 -
a = a / (b - c); -
是的。