Какой смысл использовать "f" при присвоении значения CGFloat?
Я вижу это все время:
CGFloat someCGFloat = 1.2f;
Почему используется "f"? Если CGFloat
определяется как float
, значение будет преобразовано в float
, а если CGFloat
определяется как double
, значение будет преобразовано в double
.
Следует ли убедиться, что преобразование с double
в float
не происходит? Какой смысл делать это? Кроме того, не компилятор позаботился об этом?
РЕДАКТИРОВАТЬ: Хммм... которые отвечают, чтобы принять... оба очень хороши!
Ответы
Ответ 1
1.0 по умолчанию - double, если правое значение равно 1.2, есть неявный литье, и значение получает cast from double to float (приведение не выполняется во время выполнения). В этом случае это не важно назвать его 1.2f. Программисты в основном злоупотребляют этим, но есть случаи, когда это действительно важно.
Например:
float var= 1.0e-45;
NSLog(@"%d",var==1.0e-45);
Это печатает ноль, потому что 1.0e-45 слишком мал, чтобы быть сохраненным в одну переменную с плавающей запятой, поэтому он становится равным нулю. Запись var == 1.0e-45f изменяет результат.
Использование спецификаторов формата важно, главным образом, при написании выражений, а поскольку левое значение - это float, вы ожидаете, что выражение также рассматривается как float, но это не то, что происходит.
Более ярким примером является использование спецификатора формата l для числа, которое так сильно смещается, чтобы стать нулевым, и удивляться результату:
long var= 1<<32; // I assume that an int takes 4 bytes and a long 8 bytes
Результат равен нулю, и запись 1l < 32 полностью изменяет результат.
Ответ 2
В вашем фрагменте, просто присваивании, вам не нужен суффикс "f" , и на самом деле вы не должны его использовать. Если CGFloat - одинарная точность (например, в iOS), то ваше значение будет храниться как единая точность с или без "f" , и если CGFloat является двойной точностью (например, в Mac OS), тогда вы будете излишне создавать одно значение точности, которое должно быть сохраненная двойная точность.
С другой стороны, если вы делаете арифметику, вы должны быть осторожны, чтобы использовать "f" или не использовать ее по мере необходимости. Если вы работаете с одиночной точностью и включаете литерал типа "1.2" без "f" , тогда компилятор будет продвигать другие операнды с двойной точностью. И если вы работаете с двойной точностью, и тогда вы включаете "f" (например, назначение в Mac OS), вы создадите одно значение точности только для немедленного преобразования в double.