c++中+、-、、/为二元运算符,优先级为和/高于+和-,同级左结合;整数除向零截断,除零未定义,需括号改变顺序。

加减乘除运算符的基本写法和优先级
在 C++ 里,+、-、*、/ 就是直接用的二元运算符,左右各接一个操作数。它们按数学惯例有固定优先级:* 和 / 高于 + 和 -,同级从左到右计算。
常见错误是以为 a + b * c 会先算 a + b,其实它等价于 a + (b * c)。如果真想先加再乘,必须加括号:(a + b) * c。
实操建议:
- 整数相除(如
5 / 2)结果是2,不是2.5—— 除非至少有一个操作数是浮点类型(如5.0 / 2或5 / 2.0) -
/对整数使用时会向零截断,-5 / 2得-2,不是-3 - 除零行为未定义:对任何类型(
int、double等)做/ 0都会导致程序崩溃或产生不可预测结果,必须提前检查
自定义类型的加减乘除怎么支持
如果你写了类 Vector2D 或 Complex,想让它能用 +、* 这些符号,就得重载对应运算符。最常用的是成员函数形式:
class Vector2D {
public:
double x, y;
Vector2D operator+(const Vector2D& other) const {
return {x + other.x, y + other.y};
}
Vector2D& operator+=(const Vector2D& other) {
x += other.x; y += other.y;
return *this;
}
};
注意几点:
- 只重载需要的运算符,别一上来就全写;
+=比+更高效(避免临时对象),建议优先实现+=再用它实现+ - 返回值类型要匹配习惯:二元运算符(如
+)通常返回新对象,复合赋值(如+=)返回Vector2D&以支持链式调用(a += b += c) - 不要把
operator/声明成void—— 用户会自然期待它返回商,否则破坏直觉
混合类型运算容易出错的边界情况
C++ 会自动进行隐式类型转换,但有时转换路径不唯一或不符合预期。比如:
int a = 3; double b = 2.5; auto c = a * b; → c 是 double,没问题;
但 short s = 1; char c = 2; auto x = s * c; → 实际上 s 和 c 都先提升为 int,结果是 int,不是 short 或 char。
更危险的是自定义类型和内置类型的混合:
- 如果
MyInt类有MyInt(int)构造函数且没加explicit,那么MyInt a; int b = 5; auto res = a + b;可能意外触发MyInt(b)转换,造成性能或语义问题 - 浮点数参与运算时,精度丢失不可逆:
0.1 + 0.2 != 0.3是 IEEE 754 的固有限制,不能靠换运算符解决,得用相对误差比较或定点数库 - 无符号整数减法溢出是定义良好的(回绕),但容易被误判为逻辑错误,比如
unsigned int i = 0; i - 1得到极大值,不是负数
为什么 % 不算“基本四则”但总被一起问
因为 %(取模)常和四则并列出现,但它只对整数类型有效,且行为在负数上和语言相关。C++ 标准规定:a % b 符号与被除数 a 相同,绝对值满足 |a % b| 。
这意味着:
-
7 % 3→1 -
-7 % 3→-1(不是2) -
7 % -3→1(除数符号不影响结果)
如果需要数学意义上的非负余数(比如做数组索引),得手动调整:((a % b) + b) % b,但要注意 b 不能为 0,且两次取模开销略高。
真正容易被忽略的是:浮点数没有 %,要用 fmod()(#include <cmath></cmath>),而且它处理负数的方式也和整数 % 不同。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











