C++基本算术运算符为+、-、*、/、%,均为二元运算符;整数除法截断小数(如5/2得2),取模%仅支持整数,浮点余数需用fmod();运算结果类型由操作数类型决定,与变量声明无关。

基本算术运算符怎么写
C++ 里加减乘除取余直接用 +、-、*、/、%,没有额外函数或方法包装。比如 a + b 就是加法,c % d 是取余(注意:% 只支持整数类型,对 float 或 double 用会编译报错)。
常见错误现象:
- 把
/当成“自动出小数结果”——实际若两边都是整数(如5 / 2),结果是2(向零截断),不是2.5 - 误用
%计算浮点数余数,应改用fmod()函数(需#include <cmath>)
整数除法和浮点除法的区别在哪
结果类型完全由操作数类型决定,不是由变量声明类型或后续赋值决定。C++ 不做隐式“升格”来保精度。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 想得到小数结果?至少让一个操作数是浮点型:
5.0 / 2、5 / 2.0、static_cast<double>(5) / 2</double> - 用
int a = 7; int b = 3;时,a / b永远是2,哪怕你把它赋给double c = a / b;—— 此时除法已在整数层面完成,再转 double 也救不回丢失的.333... - 如果必须从整数出发算精确除法,优先在运算前显式转换:
double result = static_cast<double>(a) / b;</double>
自增自减(++ 和 --)容易踩什么坑
前置(++i)和后置(i++)行为不同,不只是“谁先变”的问题,还影响表达式求值结果。
关键区别:
-
++i:先加 1,再返回新值(返回的是左值) -
i++:先返回原值(右值),再加 1 - 在独立语句中(如
i++;或++i;)二者效果一样;但嵌入表达式就危险了,比如arr[i++] = x;和arr[++i] = x;写入位置完全不同 - 对自定义类型(重载了
operator++),后置版本通常比前置多一次拷贝,性能敏感场景建议优先用前置
溢出怎么办:C++ 不检查整数溢出
标准 C++ 对有符号整数溢出(如 int x = INT_MAX; x++;)的行为是未定义(UB),编译器可能优化掉你的判断逻辑,也可能崩溃,也可能看似正常但结果错得离谱。
应对方式取决于场景:
- 开发/调试阶段:开编译器溢出检测,GCC/Clang 加
-fsanitize=signed-integer-overflow - 生产环境需要健壮性:自己检查边界,比如加法前判断
if (a > INT_MAX - b);或用<limits>中的std::numeric_limits<int>::max() - 更安全的替代:考虑用
std::optional<int>包装运算结果,或引入第三方库如absl::int128(大数)或boost::safe_numerics
最常被忽略的一点:溢出检查本身不能只靠 > 判断,因为比较可能又触发溢出(比如 a + b > INT_MAX 这个加法已经 UB 了)。必须用不触发运算的方式做前置判断。


















