Я читаю открытый исходный код (C ++) и не могу понять, почему они ставят enum таким образом - PullRequest
23 голосов
/ 17 августа 2011

Я обнаружил, что 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"?

Ответы [ 6 ]

40 голосов
/ 17 августа 2011

Эти числа являются восьмеричными константами.(Числа, начинающиеся с 0, но не 0x, рассматриваются в base-8).

Таким образом, -021 == -17, -020 = -16 и т. Д.

21 голосов
/ 17 августа 2011

Это восьмеричные литералы, поэтому они начинаются с 0.

Что мне интереснее и реальнее Вопрос:
Зачем использовать октальные литералы в качестве значений перечисления?

Возможно, потому что каждый бит этих восьмеричных литералов указывает на что-то.Трудно понять, что, просто увидев перечисление и отсутствие контекста, где он используется, но вам нужно подумать об этом в этом направлении, и, возможно, это будет иметь для вас больше смысла.

10 голосов
/ 17 августа 2011

Другие «ответы» отвечают на ваш вопрос, но я добавляю это в ознакомительных целях.

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,  
 };

Опять в двоичном формате (комплимент от двух):

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,  
 };

Таким образом, координата E / W равна SquareDelta&7, а координата N / S равна SquareDelta&070+SquareDelta&4.

При дальнейшем рассмотрении представляется, что они предполагали, чтобы младшая значащая восьмеричная цифра находилась в масштабе от -2 до 2 для обозначения W / E-ness, а следующая восьмеричная цифра была в масштабе от -2 до 2 до означать N / S-сущность. Если вы добавите DELTA_W+DELTA_W+DELTA_N и урежете до двух восьмеричных цифр, вы получите 006, значение DELTA_NWW. Поскольку наименее значимое восьмеричное число влияет на верхнюю часть, дельты ограничены плюсом или минусом два.

4 голосов
/ 17 августа 2011

Это 8-значные ( Редактировать: слово восьмеричные :)) числа.

2 голосов
/ 17 августа 2011

Ведущий ноль делает их основанием 8 чисел. например 021 = 17

1 голос
/ 17 августа 2011

а) Литеральные константы, начинающиеся с 0, являются восьмеричными (цифры от 0 до 7)
б) Фактические числа допускают некоторую арифметику, например, N = 10 + 2 * (E = 1) = 12 (NEE).

Но поскольку NE> N && NW> N, оно не отражает направление в круге, поэтому оно, возможно, имеет ограниченную помощь, как слово SquareDelta для меня. Возможно, это имеет больше смысла в контексте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...