在给CGFloat赋值的时候使用'f'有什么意义?

我总是看到这个:

CGFloat someCGFloat = 1.2f; 

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

只是为了确保从doublefloat的转换不会发生? 这是什么意思? 另外,编译器不会照顾这个?

编辑:嗯…哪个答案接受…都是非常好的!

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

例如:

 float var= 1.0e-45; NSLog(@"%d",var==1.0e-45); 

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

使用格式说明符在编写expression式时非常重要,而且由于左边的值是一个浮点数,所以您希望expression式也被当作浮点数处理,但这不会发生。

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

 long var= 1<<32; // I assume that an int takes 4 bytes and a long 8 bytes 

结果为零,写入1 << 32将完全改变结果。

在你的片段中,只是一个任务,你不需要'f'后缀,实际上你不应该使用它。 如果CGFloat是单精度的(就像在iOS中一样),那么你的值将被存储为单精度或不带'f',如果CGFloat是双精度(就像在Mac OS上),那么你将不必要地创build一个单精度值存储双精度。

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