2016-09-02 2 views
2

Всегда было мое понимание того, что l-ценности должны оцениваться, но по каким-то очевидным и легко объясняемым причинам. Идентификатор представляет область хранения, и значение находится в этом хранилище и должно быть восстановлено. В этом есть смысл. Но программа, нуждающаяся в оценке литерала (например, целое число 21), не имеет для меня никакого смысла. Значение прямо там, насколько яснее вы можете получить? Ну, помимо добавления U для unsigned или какого-либо другого суффикса. Вот почему мне интересно, какие литералы нужно оценивать, поскольку я видел это только в одном месте. Большинство книг также включают терминологию, такую ​​как «Первичное выражение», «операнд» или «подвыражение» и т. П., До того момента, когда линии начинают размываться. За все это время мне еще предстоит увидеть ясное объяснение этой конкретной вещи. Это кажется пустой тратой вычислительной мощности.Ли литералы на C++ действительно оценивают?

+1

* «Я видел это только в одном месте» * - поделитесь? – LogicStuff

+2

"l-values ​​должны оценивать" Что это значит? – juanchopanza

+0

l-значения имеют значения переменных, которые необходимо получить –

ответ

6

Обычный литерал должен быть оценен только при компиляции компилятором.

Определенный пользователем литерал может быть оценен также во время выполнения. Например, после включения заголовка <string> и создания его литералов ...s, доступных по директиве using namespace std::string_literals;, тогда "Blah"s является определяемым пользователем литералом типа std::string. Часть "Blah" оценивается компилятором во время компиляции. Преобразование в std::string, которое включает динамическое распределение, обязательно происходит во время выполнения.

+0

* Обычный компилятор должен быть оценен только при компиляции компилятором. * Строго говоря, это не совсем верно для типов с плавающей точкой. См. [Мой ответ] (http://stackoverflow.com/a/39293264/6394138). – Leon

+0

@Leon Он действительно сказал * обычный * литерал ..... – DarthRubik

+0

@Leon: Я не могу себе представить, что для каждого литерала fp может быть больше двух возможных двоичных результатов. Таким образом, это не проблема создания как во время компиляции. Во время выполнения режим округления может просто переключаться между блоками значений. Но так как я не слышал о такой схеме, я думаю, что это не делается на практике. –

1

Но программа, нуждающаяся в оценке литерала (например, целое число 21), не имеет для меня никакого смысла. Значение прямо там, сколько более явное вы можете получить?

Для типов с плавающей точкой вещи немного сложнее. Рассмотрим номер 0.1. В двоичном формате он не может быть представлен точно, и для него должно быть выбрано ближайшее представление с плавающей запятой. Если вы вводите это число во время выполнения, преобразование 0.1 в двоичное представление должно учитывать режим округления (вверх, вниз, к нулю, к бесконечности). Строгая обработка арифметики с плавающей запятой предполагает, что преобразование литерала с плавающей запятой 0.1 в двоичное представление также должно выполняться в соответствии с режимом округления (который становится известным только во время выполнения) и поэтому не может быть выполнен компилятором (на самом деле большая его часть может выполняться компилятором, но окончательное округление должно выполняться во время выполнения с учетом режима округления).

+1

Это не обязательно для выполнения во время выполнения. Стандарт C++, §2.13.4 утверждает: «... Если масштабированное значение находится в диапазоне представляемых значений для его типа, результатом является масштабированное значение, если оно представлено, иначе большее или меньшее представляемое значение, ближайшее к масштабированному значению, выбранное в определяемый реализацией. ... ». Это означает, что компилятор должен * документировать *, как это делается, но это также может быть сделано во время компиляции. – alain

Смежные вопросы