Действительно ли литералы в C ++ действительно оценивают?

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

2

Решение

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

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

6

Другие решения

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

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

1

По вопросам рекламы [email protected]