C++整数除法截断向零,取余仅支持整数,自增/自减前置与后置影响表达式值,混合运算自动提升但可能精度丢失,溢出检测需谨慎。

加减乘除用 + - * /,但整数除法会截断
C++ 的算术运算符就是基础符号,没额外函数或方法包装。但关键在于:当两个 int 相除(比如 5 / 2),结果是 2,不是 2.5——小数部分直接丢弃,不四舍五入。
常见错误现象:int a = 7; int b = 3; double c = a / b; → c 实际是 2.0,不是 2.333...,因为除法在 int 间先完成,再转 double。
- 想保留小数?至少一个操作数转成浮点类型:
static_cast<double>(a) / b</double>或a / 3.0 -
/对负数也截断向零:-7 / 3得-2,7 / -3也是-2 -
%(取余)只支持整数类型,5.5 % 2编译不过
++ 和 -- 放前放后,值和副作用顺序真不一样
前置 ++i 先自增再用新值;后置 i++ 先用旧值,再自增。这不是“习惯问题”,而是表达式求值结果不同,尤其在复杂表达式里容易出错。
使用场景:循环中单独写 i++ 或 ++i 效果一样;但用在赋值或函数参数里就危险了。
立即学习“C++免费学习笔记(深入)”;
-
int i = 5; int a = i++;→a == 5,i == 6 -
int i = 5; int b = ++i;→b == 6,i == 6 -
func(i++);传的是旧值;func(++i);传的是新值 - 性能上,前置略优(后置需临时保存旧值),但编译器常优化掉差异;逻辑正确性比这点开销重要得多
混合类型运算时,C++ 自动提升,但可能丢失精度
当 int 和 float 一起算(比如 int + float),C++ 按规则把 int 转成 float 再算。看似方便,但大整数转 float 可能无法精确表示。
常见错误现象:int x = 16777217; float y = x; cout 输出 <code>0(false),因为 float 在这个范围已无法区分相邻整数。
- 涉及精度敏感计算(如金融、科学),避免隐式转换,显式用同类型:全
double或全long long -
char、short运算时自动升为int,所以char a = 127, b = 1; a + b是int类型的128,不是char - 强制转换要小心:
(int)3.9得3,不是四舍五入;需要四舍五入得用std::round
溢出是未定义行为,别靠“好像能跑”来测试
C++ 标准对有符号整数溢出(如 int 超过 INT_MAX)定义为未定义行为(UB)。编译器可以生成任何结果——包括看起来正常、崩溃、或删掉整段代码。
常见错误现象:本地测试 int i = INT_MAX; i++; 好像变成 INT_MIN(补码绕回),但换编译器/优化等级后行为突变;或者某次调试时没问题,发布后出错。
- 无符号整数溢出是定义好的(模运算),
unsigned int u = UINT_MAX; u++;确定得0 - 检测溢出不能只靠结果判断,要用标准库:
std::add_overflow(C++23)、或手动比较边界(如i > INT_MAX - j判断加法是否溢出) -
-O2下编译器可能假设“不会溢出”而优化掉防护逻辑,所以依赖运行时检查必须显式禁用相关优化或用 volatile 中间变量(慎用)
算术运算看着简单,但类型、顺序、溢出这三块最容易在上线后咬人——尤其是跨平台或开高优化时,别信“我试过没问题”。










