char转int得减'0'才得数字值,直接赋值获ascii码;须先判断字符是否为'0'–'9',再执行int n = c - '0',否则结果错误。

char 直接转 int 就是 ASCII 码值,不是数字字符对应的数值
很多人写 int x = '5',结果得到 53,一脸懵——这不是想要的 5。因为 C++ 里 char 是小整型,赋值给 int 时直接提升为 ASCII 值,不是“把字符 '0'–'9' 转成对应数字”。真要转数字,得判断、计算或调用函数。
单个数字字符转 int:减去 '0' 最快最安全
前提是确定该 char 确实是 '0' 到 '9' 之间的字符。否则会得到错误结果(比如 'a' - '0' = 49)。
- 写法:
int n = c - '0',其中c是char - 原理:ASCII 中 '0'–'9' 连续排列,
'0'值为 48,所以'5' - '0' == 53 - 48 == 5 - 不依赖 locale,无函数调用开销,编译期可优化
- 别写
c - 48——可读性差,且不符合字符语义
不确定输入是否为数字字符?先检查再转
从用户输入、文件读取或网络接收来的 char,不能默认它是数字。跳过检查直接减 '0' 可能导致逻辑错误甚至越界计算(虽然不会崩溃,但结果错得离谱)。
- 检查方式:
if (c >= '0' && c ,比 <code>std::isdigit(c)更轻量,且不依赖<cctype></cctype>或 locale - 错误处理建议:设默认值或抛异常,例如
int n = (c >= '0' && c -
std::isdigit(c)接受int,传char时要注意符号扩展问题(char为负时可能传入负值,导致未定义行为),所以更推荐范围比较
想转整个字符串(如 "123")?别用 char 转 int 思路硬套
看到标题说“char 转 int”就对单个字符动手,结果发现实际要处理的是字符串,这是高频误判点。
立即学习“C++免费学习笔记(深入)”;
-
std::stoi("123")简单直接,但抛异常;std::strtol("123", nullptr, 10)更底层,可检测转换结束位置和溢出 - 手写循环也行:
int val = 0; for (char c : s) { if (c '9') break; val = val * 10 + (c - '0'); },注意溢出检查(常被忽略) - 别用
atoi("123")——无法区分 "0" 和非法输入(如 "abc")
字符转数字这一步本身很简单,真正容易出问题的是上下文:你到底在处理一个字符,还是一串字符?有没有校验?要不要容错?这些地方一漏,后面调试半天都在找哪来的 53。










