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