Я не могу найти это в документах Apple так: что делает "f" после того, как числа здесь укажут? Это от C или Objective C? Есть ли какое-либо различие в не добавлении этого к постоянному числу?
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
Можете Вы объяснять, почему я просто не записал бы:
CGRect frame = CGRectMake(0, 0, 320, 50);
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
использует константы с плавающей точкой. (Константа 0.0 обычно объявляет двойку в Objective-C; добавление буквы f в конце - 0.0f - объявляет константу как (32-битное) плавающее число.)
CGRect frame = CGRectMake(0, 0, 320, 50);
использует ints, которые будут автоматически преобразованы в плавающие числа.
В этом случае нет никакой (практической) разницы между ними.
В случае сомнений проверьте вывод ассемблера. Например, напишите небольшой минимальный фрагмент кода, например, такой
#import <Cocoa/Cocoa.h>
void test() {
CGRect r = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
NSLog(@"%f", r.size.width);
}
Затем скомпилируйте его на ассемблер с параметром -S
.
gcc -S test.m
Сохраните вывод ассемблера в файле test.s
, удалите .0f
из констант и повторите команду компиляции. Затем выполните diff
нового test.s
и предыдущего. Думаю, это должно показать, есть ли какие-то реальные различия. Я думаю, что слишком многие имеют видение того, что, по их мнению, делает компилятор, но, в конце концов, нужно знать, как проверять любые теории.
Иногда есть разница.
float f = 0.3; /* OK, throw away bits to convert 0.3 from double to float */
assert ( f == 0.3 ); /* not OK, f is converted from float to double
and the value of 0.3 depends on how many bits you use to represent it. */
assert ( f == 0.3f ); /* OK, comparing two floats, although == is finicky. */
Литерал с плавающей запятой в исходном коде анализируется как двойной. Присвоение его переменной типа float приведет к потере точности. Большая точность, вы отбрасываете 7 значащих цифр. Постфикс «f» позволяет вам сказать компилятору: «Я знаю, что делаю, это сделано намеренно. Не пугайте меня по этому поводу».
Вероятность появления ошибки не так уж и мала. Многие программы отказались от непродуманного сравнения с плавающей запятой или предположили, что 0,1 точно представимо.
Из языка С. Это означает литеральную константу float. Вы можете опустить как "f", так и ".0" и использовать ints в вашем примере из-за неявного преобразования ints в float.
Это почти наверняка из языка C и отражает желание использовать тип 'float', а не 'double'. Это похоже на суффиксы типа L на числах, чтобы указать, что они являются длинными целыми числами. Вы можете просто использовать целые числа, и компилятор автоматически преобразует их в нужные (для данного конкретного сценария).
Это особенность языка C - литералы с плавающей точкой по умолчанию имеют двойную точность (double). Добавление суффикса f делает их одинарной точности (float).
Вы можете использовать ints для указания значений, и в данном случае это не будет иметь никакого значения, но использование правильного типа - хорошая привычка, которую следует выработать - последовательность в целом хорошая вещь, и если вам понадобится изменить эти значения позже, вы с первого взгляда будете знать, какого они типа.