玩转 C++ 算术运算符(五十二)
1. 运算符一览(左结合律)
运算符 | 功能 | 语法 |
---|---|---|
+ | 一元正号 / 一元负号 | +expr / -expr |
* / % | 乘 / 除 / 取余 | expr*expr / expr/expr / expr%expr |
+ - | 加 / 减 | expr+expr / expr-expr |
- 一元运算 (
+x
,-x
) - 乘除取余 (
*
,/
,%
) - 加减法 (
+
,-
)
注意:所有符号都满足左结合律,同级运算符从左往右结合。
2. 小整数如何“升级”?
在表达式求值前,C++ 总会把 bool
、char
、short
等 小于 int
的类型 提升(integral promotion)到 int
或 unsigned int
:
char c = 100;
short s = 20000;
int x = c + s; // c 和 s 均提升为 int,然后相加
这样可以避免因字符或短整型太小带来的溢出风险。
3. 算术运算与指针
-
指针 + / – 整数
p + n
:指向原数组中第n
个元素p - n
:向后移动n
个元素
-
指针 – 指针
p2 - p1
:两指针之间的距离(元素个数)
int arr[5] = {0,1,2,3,4};
int* p = arr; // 指向 arr[0]
int* q = p + 3; // 指向 arr[3]
std::ptrdiff_t d = q-p; // d == 3
指针运算符优先级与常规算术相同,都高于加减。
4. 取余 %
的那些坑
- 只作用于整数
- 符号与被除数相同,商向 0 舍入(C++11 起)
21 % 6 == 3
21 % -8 == 5 // 符号同被除数 21
-21 % 8 == -5 // 符号同被除数 -21
保证 a == (a/b)*b + a%b
恒成立。
5. 浮点、混合类型运算
- 除法
/
- 整数 ÷ 整数 → 整数(舍弃小数部分)
- 只要一个操作数是浮点,就按浮点来算
int i = 7 / 2; // i == 3
double d = 7.0/2; // d == 3.5
d = 7 / 2.0; // d == 3.5
- 小心混合布尔运算
bool
→ 提升为int(0/1)
,再参与算术。
6. 小结与准则
- 牢记优先级:先乘除,后加减;一元运算最高。
- 利用括号:让意图一目了然,避免歧义。
- 留心类型提升:
char/short/bool → int
;混合算术遵循“大”类型。 - 指针算术:
p + n
移动n
个元素;p2 - p1
为元素距离。 - 不要对同一对象“又读又写” 在一个表达式里,否则顺序不定,行为未定义!
掌握这些,你的 C++ 算术运算将更严谨、更安全、更清晰。下次写 a + b * c / d - e % f
时,不妨默念一遍“大乘小加再括号”,BUG 自会少许多。欢迎点赞、评论交流你在运算符使用中的心得!