在为CGFloat赋值时使用'f'有什么意义?

fum*_*007 15 macos cocoa cocoa-touch objective-c ios

我一直都看到这个:

CGFloat someCGFloat = 1.2f;
Run Code Online (Sandbox Code Playgroud)

为什么使用'f'?如果CGFloat定义为float,则该值将转换为a float,如果CGFloat定义为a double,则该值将转换为a double.

难道只是为了确保转换doublefloat不会发生?这样做有什么意义?此外,编译器不会处理这个吗?

编辑:嗯......接受的答案......两者都非常好!

Ram*_*uri 8

1.0默认为double,如果正确值为1.2则存在隐式转换,并且值从double转换为float(转换不是运行时操作).在这种情况下,称它为1.2f并不重要.程序员大多滥用它,但有些情况下它非常重要.

例如:

float var= 1.0e-45;
NSLog(@"%d",var==1.0e-45);
Run Code Online (Sandbox Code Playgroud)

这打印为零,因为1.0e-45太小而无法存储到单个精度浮点变量中,因此它等于零.写var == 1.0e-45f会改变结果.

在编写表达式时,使用格式说明符很重要,因为左值是浮点数,你期望表达式也被视为浮点数,但事实并非如此.

一个更引人注目的情况是,在一个数字上使用l格式说明符时,这个数字会变得很大而变为零,并对结果感到惊讶:

long var= 1<<32;  // I assume that an int takes 4 bytes and a long 8 bytes
Run Code Online (Sandbox Code Playgroud)

结果为零,并且写入1l << 32完全改变结果.


Aar*_*den 7

在你的代码片段中,只是一个赋值,你不需要'f'后缀,实际上你不应该使用它.如果CGFloat是单精度(如在iOS中)那么你的值将存储单精度,有或没有'f',如果CGFloat是双精度(如在Mac OS上),那么你将不必要地创建一个单一的精度值存储双精度.

另一方面,如果你在做算术,你应该小心使用'f'或不使用它.如果你正在使用单精度并且包含一个没有'f'的文字'1.2'那么编译器会将其他操作数提升为双精度.如果你正在使用双精度并且然后包含'f'(就像Mac OS上的赋值一样),你将创建一个单一的精度值,只是让它立即转换为double.