以零开头的数字有什么特殊之处?

8

这可能是一个比较蠢的问题,但对我来说还是很有趣的)

这是我在使用Visual Studio 2013时看到的结果。

int i = 07;     // i == 7
int i = 16;     // i == 16
int i = 00016;  // i == 14, why?
int i = 05016;  // i == 2574, wow )
int i = 08;     // compile error, compiler expects octal number...

如果一个数字以零开头并包含数字8,那么这是编译错误。这是正常的吗?如果00016等于14,编译器会怎么处理以零开头的数字呢?

感谢大家 ))


八进制整数字面量。(任何基本的C或C++教程都应该涵盖。) - The Paramagnetic Croissant
3
恭喜您正确而彻底地识别出了一个模式。 :) 但是,没有进行后续研究就不太好了!:( - Lightness Races in Orbit
7
编译器中包含“八进制”一词的提示有点透露了端倪… - SirDarius
4个回答

14

是的,这是可以预料的。

[C++11: 2.14.2/1]: 整数字面值(integer literal)是一串不包含小数点或指数部分的数字。整数字面值可以带有前缀以指定其进制和后缀以指定其类型。数字序列中字典序最小的数字是最高位的数字。一个十进制(base ten)的整数字面值以非0数字开头,由一串十进制数字组成。一个八进制(base eight)的整数字面值以数字0开头,由一串八进制数字组成。22 一个十六进制(base sixteen)的整数字面值以0x或0X开头,由一串十六进制数字组成,包括十进制数字和字母a到f及A到F,它们对应的十进制值是10到15。[ 例如:数字12可以写作12、014或0XC。—end example ]

22 数字8和9不是八进制数字。


6

0开头的整数字面量是一个八进制数,就像以0x开头的是十六进制数一样。

八进制数只能包含数字07,这就是为什么你会得到编译错误的原因。


5

0开头的整数字面值是八进制字面值。因此,它们只能包含数字0-7。

有趣的是,这还包括字面量0本身。


3
@LightnessRacesinOrbit:我一直在我的每月例会上使用这个小知识作为打破僵局的话题。我想你需要适当地加强它,让它更有趣味性。 - Kerrek SB
2
@LightnessRacesinOrbit 我认为人们不会期望0是一个八进制字面量。 - David G
2
@LightnessRacesinOrbit 没什么。如果人们能够认真阅读一份初学者教程,那将是有趣的事情。 - The Paramagnetic Croissant
1
@LightnessRacesinOrbit 或许是十进制?这是我最初的想法。 - David G
4
实际上,在这种情况下,这是最简单的选择:将其定义为其他基数将需要针对仅由一个字符长且以零开头的整数字面值进行例外处理。 - user308323
显示剩余9条评论

3

以0开头的数字是八进制数,因此数字8和9是不合法的,而您的其他示例显示将其转换为十进制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接