You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何输入带前导零的十进制数时cin会忽略前导零?

为什么输入00325给cin >> i会得到325而不是拆分读取?

嘿,这个问题抓得很准!我来给你梳理C++标准(N4140)里的相关规定,彻底解释清楚这个行为。

首先要明确:cin >> i这类算术提取操作是按**令牌(token)**来处理输入的,不是逐字符拆分读取。默认情况下,输入流会把连续的非空白字符当作一个完整的令牌,除非遇到空白符(空格、换行、制表符等)才会分割令牌。

十进制整数的解析规则(来自N4140)

在N4140的**27.7.2.2.1节(格式化输入函数的算术提取)**里,明确规定了十进制整数的解析逻辑:

  1. 首先跳过输入流中的前导空白字符(如果存在);
  2. 读取一个可选的正负号(+或-);
  3. 接着读取一串十进制数字(0-9),这串数字会被当作一个完整的数值部分——前导零只是这串数字的一部分,不会触发特殊解析(比如八进制),也不会把数字拆分成多个令牌;
  4. 最后将解析出的数值转换为目标整数类型(这里是int)。

所以当你输入00325时,整个字符串是一个没有空白的连续令牌,会被一次性解析为十进制数325,而不是拆分成0、0、325三个令牌分别读取。

关于八进制的补充

你提到的八进制解析只有在显式设置std::oct操纵符(比如cin >> std::oct >> i;)时才会生效。此时,以0开头的数字串会被当作八进制解析,但默认模式下是十进制,前导零没有特殊含义,只是普通的数字字符。

总结

cin >> i的行为完全符合C++标准的规定:连续的非空白数字字符会被当作一个完整的整数令牌解析,前导零在十进制模式下不改变数值,也不会拆分令牌。不管输入是325还是00325,最终都会得到值325。

内容的提问来源于stack exchange,提问作者ynn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:14:55