Как это возможно, что восьмеричный литерал может быть отрицательным?
Почему n
в
const int n = -0123;
Восьмеричный литерал? Я думал, что все восьмеричные литералы должны начинаться с 0, а этот-нет, так как он начинается с отрицательного.
Это маленький пункт, который я знаю, но он вызывает у меня большое замешательство!
3 ответа:
Как это возможно, что восьмеричный литерал может быть отрицательным?
Нет отрицательных целых литералов, только положительные. Литерал здесь-0123, который действительно начинается с 0 и, таким образом, является восьмеричным.
-
в этом выражении является унарным оператором минус.
Это абсолютно верно. Однако то же самое относится ко всем целочисленным литералам - десятичным, шестнадцатеричным, восьмеричным и двоичным. На самом деле отрицательных целых литералов не существует. Такие выражения, как
-1
, применяют унарный оператор минус к значению, представленному литералом, что может включать неявные преобразования типов (Ссылка).
Вы, кажется, слегка путаетесь в литералах, так что:
Короче говоря, литерал-это способ описания типа, который можно увидетьбуквально в коде. Целое число является литералом, потому что когда вы пишете, например4
в своем коде. Вы можете буквально видеть, что это число четыре, и числа интерпретируются какint
s по умолчанию, если они не имеют точки (.
) после них или любого другого допустимого суффикса.Однако, вы можете сказать, чтобы интерпретируйте его как неподписанное письмо
4u
. Теперь вы можете буквально увидеть, что это число 4 интерпретируется как беззнаковое. Аналогично, значение"Hello World"
является строковым литералом, потому что вы можете сказать в коде, что это строка"Hello World
". С другой стороны, определяемый пользователем классPerson
не имеет никакого буквального способа быть замеченным в коде. В C++14, однако, можно создавать пользовательские литералы, но дляPerson
это все равно, возможно, не имеет смысла. Стандартная библиотека использует это в заголовке<chrono>
, определяя литералы, такие какs
,ms
иns
Для секунд, миллисекунд и наносекунд соответственно.При написании восьмеричного
-0123
вы говорите интерпретировать его как восьмеричное значение точно так же, как0xFF
буквально интерпретирует как шестнадцатеричное. Знак-
- это просто способ применить унарный оператор отрицания к числу0123
.