Как это возможно, что восьмеричный литерал может быть отрицательным?


Почему n в

const int n = -0123;

Восьмеричный литерал? Я думал, что все восьмеричные литералы должны начинаться с 0, а этот-нет, так как он начинается с отрицательного.

Это маленький пункт, который я знаю, но он вызывает у меня большое замешательство!

3 4

3 ответа:

Как это возможно, что восьмеричный литерал может быть отрицательным?

Нет отрицательных целых литералов, только положительные. Литерал здесь-0123, который действительно начинается с 0 и, таким образом, является восьмеричным. - в этом выражении является унарным оператором минус.

Это абсолютно верно. Однако то же самое относится ко всем целочисленным литералам - десятичным, шестнадцатеричным, восьмеричным и двоичным. На самом деле отрицательных целых литералов не существует. Такие выражения, как -1, применяют унарный оператор минус к значению, представленному литералом, что может включать неявные преобразования типов (Ссылка).

Вы, кажется, слегка путаетесь в литералах, так что:

Короче говоря, литерал-это способ описания типа, который можно увидетьбуквально в коде. Целое число является литералом, потому что когда вы пишете, например 4 в своем коде. Вы можете буквально видеть, что это число четыре, и числа интерпретируются как int s по умолчанию, если они не имеют точки (.) после них или любого другого допустимого суффикса.

Однако, вы можете сказать, чтобы интерпретируйте его как неподписанное письмо 4u. Теперь вы можете буквально увидеть, что это число 4 интерпретируется как беззнаковое. Аналогично, значение "Hello World" является строковым литералом, потому что вы можете сказать в коде, что это строка "Hello World". С другой стороны, определяемый пользователем класс Person не имеет никакого буквального способа быть замеченным в коде. В C++14, однако, можно создавать пользовательские литералы, но для Person это все равно, возможно, не имеет смысла. Стандартная библиотека использует это в заголовке <chrono>, определяя литералы, такие как s, ms и ns Для секунд, миллисекунд и наносекунд соответственно.

При написании восьмеричного -0123 вы говорите интерпретировать его как восьмеричное значение точно так же, как 0xFF буквально интерпретирует как шестнадцатеричное. Знак - - это просто способ применить унарный оператор отрицания к числу 0123.