2016-07-01 4 views
-1

Производит ли эти строки один и тот же скомпилированный код?Являются ли литералы типами во время компиляции?

double one = 1.0; 
double one = 1.f; 
double one = 1; 

Или это три?

float one = 1.0; 
float one = 1.f; 
float one = 1; 

Редактировать

Предположим, что значения на правой стороне могут быть сохранены в виде 32-битного поплавка

+2

Да для обоих. Эти преобразования типов происходят во время компиляции. – T33C

+2

Да, они ... – mvidelgauz

+3

В случае значения «1» они, скорее всего, будут, но в общем случае это может быть зависимо от платформы/компилятора. С некоторым двойным значением (с использованием полной двойной точности) строка, заканчивающаяся на «f», должна отличаться (не используя полную двойную точность, обрезая/округляя ее до точности поплавка). – Ped7g

ответ

7

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

Но один пример, который вы приводите, представляет собой преобразование из литерала типа double для ввода float. Это становится сложно. Для компиляторов, которые поддерживают флаги состояния с плавающей запятой (какие компиляторы C должны поддерживать, когда используется прагма FENV_ACCESS, даже если ни gcc, ни clang не реализуют эту прагму), такое преобразование потенциально может иметь побочный эффект повышения «неточного» исключения, если преобразование с double в float потеряло бы точность. В вашем случае точность не будет потеряна, но, например, float f = 1.1;, это почти наверняка было бы. Если float f = 1.1; и float f = 1.1f; имеют явно различное поведение, компилятор не может превратить один в другой.

2

На практике, я был бы удивлен, если бы они не сделали , Заявления очень просты и могут быть тривиально разрешены во время компиляции.

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

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