在给CGFloat赋值的时候使用'f'有什么意义?
我总是看到这个:
CGFloat someCGFloat = 1.2f;
为什么使用'f'? 如果CGFloat
被定义为float
,则该值将被转换为float
,如果CGFloat
被定义为double
,则该值将被转换为double
。
只是为了确保从double
到float
的转换不会发生? 这是什么意思? 另外,编译器不会照顾这个?
编辑:嗯…哪个答案接受…都是非常好的!
默认情况下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值。