从零开始的数字有什么特别之处?

Gri*_*gor 3 c c++ compiler-construction syntax numbers

这有点愚蠢的问题,但对我来说很有意思)

这就是我在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...
Run Code Online (Sandbox Code Playgroud)

如果number从零开始并且包含8,则编译错误.这是正常的吗?如果00016 == 14,那么编译器在启动零时究竟做了什么?

谢谢大家 ))

Lig*_*ica 10

是的,这是预料之中的.

[C++11: 2.14.2/1]:字面整数是数字序列不具有周期或指数部分.整数文字可以具有指定其基数的前缀和指定其类型的后缀.数字序列的词汇第一个数字是最重要的.甲十进制整数文字(基10)开始于0以外的位数和由十进制数字序列的.一个八进制整数文字(基8)开始于数字0和由八进制数字序列.22十六进制整数文字(基数为16)以0x或0X开头,由一系列十六进制数字组成,包括十进制数字和字母a到f和A到F,十进制值为十到十五.[例如:数字12可以写成12,014或0XC. - 末端的例子]

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


Ker*_* SB 5

以 开头的整数文字0八进制文字。因此它们必须仅包含数字 0–7。

(有趣的是,这包括文字0本身。)

  • @0x499602D2 事实上,在这种情况下,这是最简单的选择:将其定义为其他基数需要在整数文字只有一个字符长且以零开头的情况下例外。 (4认同)
  • @LightnessRacesinOrbit:我在每月的例行站立会议中反复使用这个事实作为破冰之道。我想你需要稍微加强一下。 (3认同)
  • @LightnessRacesinOrbit 我认为人们不会期望 0 是八进制文字。 (2认同)
  • @LightnessRacesinOrbit 什么也没有。如果人们能够*一次*仔细阅读初学者教程,那会很有趣。 (2认同)

小智 5

以...开头的整数文字0是一个八进制数,非常类似于0x以十六进制数开头的数字.

八进制数只能包含数字07,这就是为什么你会得到一个编译错误.