Какой смысл использовать "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.