为何输入带前导零的十进制数时cin会忽略前导零?
为什么输入
00325给cin >> i会得到325而不是拆分读取? 嘿,这个问题抓得很准!我来给你梳理C++标准(N4140)里的相关规定,彻底解释清楚这个行为。
首先要明确:cin >> i这类算术提取操作是按**令牌(token)**来处理输入的,不是逐字符拆分读取。默认情况下,输入流会把连续的非空白字符当作一个完整的令牌,除非遇到空白符(空格、换行、制表符等)才会分割令牌。
十进制整数的解析规则(来自N4140)
在N4140的**27.7.2.2.1节(格式化输入函数的算术提取)**里,明确规定了十进制整数的解析逻辑:
- 首先跳过输入流中的前导空白字符(如果存在);
- 读取一个可选的正负号(
+或-);- 接着读取一串十进制数字(0-9),这串数字会被当作一个完整的数值部分——前导零只是这串数字的一部分,不会触发特殊解析(比如八进制),也不会把数字拆分成多个令牌;
- 最后将解析出的数值转换为目标整数类型(这里是
int)。
所以当你输入00325时,整个字符串是一个没有空白的连续令牌,会被一次性解析为十进制数325,而不是拆分成0、0、325三个令牌分别读取。
关于八进制的补充
你提到的八进制解析只有在显式设置std::oct操纵符(比如cin >> std::oct >> i;)时才会生效。此时,以0开头的数字串会被当作八进制解析,但默认模式下是十进制,前导零没有特殊含义,只是普通的数字字符。
总结
cin >> i的行为完全符合C++标准的规定:连续的非空白数字字符会被当作一个完整的整数令牌解析,前导零在十进制模式下不改变数值,也不会拆分令牌。不管输入是325还是00325,最终都会得到值325。
内容的提问来源于stack exchange,提问作者ynn
相关产品推荐
相关产品推荐

