我正在阅读开源代码(C++),无法弄清楚为什么他们以这种方式放置枚举
I'm reading open source code (C++) and can't figure out why they put enum this way
我发现enum是这样定义的,不明白为什么他们把前导零放在那里。
enum SquareDelta {
DELTA_SSW = -021,
DELTA_SS = -020,
DELTA_SSE = -017,
DELTA_SWW = -012,
DELTA_SW = -011,
DELTA_S = -010,
DELTA_SE = -07,
DELTA_SEE = -06,
DELTA_W = -01,
DELTA_ZERO = 0,
DELTA_E = 01,
DELTA_NWW = 06,
DELTA_NW = 07,
DELTA_N = 010,
DELTA_NE = 011,
DELTA_NEE = 012,
DELTA_NNW = 017,
DELTA_NN = 020,
DELTA_NNE = 021
};
我猜这不仅仅是普通的int enum,但它是什么?可以是十六进制格式的数字,以"0x"开头吗?
这些数字是八进制常量。(以0
开头但不以0x
开头的数字以8为进制)。
因此,-021 == -17,-020 = -16,等等
这些是八进制文字,因此它们从0开始。
哪个更有趣&对我来说真正的问题是:
为什么使用八进制文字作为枚举值?
可能,因为这些八进制文字的每一位都表示一些东西。仅通过查看枚举而不查看其使用的上下文,很难确定是什么,但您需要从这个方向考虑它,也许它对您更有意义。
其他"答案"回答了你的问题,但我添加这个是为了提供信息。
enum SquareDelta {
DELTA_NNW= 017,DELTA_NN = 020,DELTA_NNE= 021
DELTA_NWW= 006,DELTA_NW = 007,DELTA_N = 010,DELTA_NE = 011,DELTA_NEE= 012,
DELTA_W =-001,DELTA_ZER= 000,DELTA_E = 001,
DELTA_SWW=-012,DELTA_SW =-011,DELTA_S =-010,DELTA_SE =-007,DELTA_SEE=-006,
DELTA_SSW=-021,DELTA_SS =-020,DELTA_SSE=-017,
};
同样,在二进制(twos compliment)中:
enum SquareDelta {
DELTA_NNW=001111,DELTA_NN =010000,DELTA_NNE=010001
DELTA_NWW=000110,DELTA_NW =000111,DELTA_N =001000,DELTA_NE =001001,DELTA_NEE=001010,
DELTA_W =111111,DELTA_ZER=000000,DELTA_E =000001,
DELTA_SWW=110110,DELTA_SW =110111,DELTA_S =111000,DELTA_SE =111001,DELTA_SEE=111010,
DELTA_SSW=101111,DELTA_SS =110000,DELTA_SSE=110001,
};
因此东w坐标为SquareDelta&7
, N/S坐标为SquareDelta&070+SquareDelta&4
。
经过进一步审查,他们似乎打算将最不有效的八进制数字从-2到2表示W/E-ness,下一个八进制数字从-2到2表示N/S-ness。如果将DELTA_W+DELTA_W+DELTA_N
相加并截断为两个八进制数字,则得到DELTA_NWW
的值006。由于最不显著的八进制数会影响最高的八进制数,因此delta值被限制为正负2。
这些都是基于8的数字(Edit:这个单词是八进制的:))。
前导0是8进制数。例021 = 17
a)以0开头的文字常量为八进制(从0到7的数字)
b)实际数字允许一些算术运算,如N=10 + 2*(E=1) = 12 (NEE)。
但由于NE> N &&NW> N,它不反映圆的方向,所以它的帮助可能有限,就像SquareDelta这个词对我来说一样。也许,这在上下文中更有意义
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 使用std ::函数时运行时异常.他们为什么不指向有效的代码
- 为什么static_cast允许下落,而逻辑上应该出于安全目的拒绝他们static_cast与安全无关?
- 为什么他们坚持在下面的示例中使用"extern"说明符?
- 为什么有时人们更喜欢Strtoll而不是Strtol,即使他们只想将字符串转换为INT32
- 为什么他们在原型模式中这么说 - 用于在需要新对象时简单地复制原始对象
- 为什么人物在处理他们之后会出现像
- 为什么他们要对特定的初始化列表进行特殊处理,而不是对它们进行相同的处理呢?
- 为什么Microsoft在他们的 winnt.h 文件中两次 typedef 声明什么构成 "double" ?
- Libevent:为什么evutil_make_socket_nonblocking在他们的例子中被调用了两次
- 我正在阅读开源代码(C++),无法弄清楚为什么他们以这种方式放置枚举
- 为什么我们需要在运行时使用函数指针调用这些函数?我们也可以直接打电话给他们
- 为什么微软在他们的c++代码中使用了这么多宏?
- 他们为什么不添加 iota 的运营商版本?
- 为什么我们可以在他们的类范围之外定义私有成员
- 在Doom3的源代码中,为什么他们使用bitshift来生成数字而不是硬编码它?