Sie dürfen nicht zur Kompilierzeit konvertiert werden, es sei denn, der Compiler kann nachweisen, dass die Konvertierung zur Kompilierungszeit der Konvertierung zur Laufzeit entspricht. Wenn der Compiler dies beweisen kann, und für viele Typen ist es einfach, führen die meisten Compiler die Konvertierung zur Kompilierungszeit durch.
Aber ein Beispiel, das Sie geben, ist eine Umwandlung von einem Literal vom Typ double
zu Typ float
. Das wird schwierig. Für Compiler, die Floating-Point-Statusflags unterstützen (die C-Compiler unterstützen müssen, wenn das Pragma FENV_ACCESS
verwendet wird, obwohl weder gcc noch clang dieses Pragma implementieren), hat eine solche Konvertierung möglicherweise den Nebeneffekt, eine "ungenaue" Ausnahme auszulösen Die Umwandlung von double
zu float
würde die Genauigkeit verlieren. In Ihrem Fall wäre die Präzision nicht verloren, sondern z. float f = 1.1;
, wäre es fast sicher. Wenn float f = 1.1;
und float f = 1.1f;
ein sichtbar unterschiedliches Verhalten haben, kann ein Compiler nicht ineinander übergehen.
Ja zu beiden. Diese Typumwandlungen finden zur Kompilierzeit statt. – T33C
Ja, sie sind ... – mvidelgauz
Im Fall von Wert "1" werden sie sehr wahrscheinlich, aber im Allgemeinen kann dies Plattform/Compiler abhängig sein. Bei einem doppelten Wert (mit der vollen doppelten Genauigkeit) sollte die Zeile, die mit "f" endet, abweichen (nicht mit voller doppelter Genauigkeit, Abschneiden/Runden auf Float-Genauigkeit). – Ped7g