15

我经常看到这个:

CGFloat someCGFloat = 1.2f;

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

是否只是为了确保不会发生从doubleto的转换?float这样做有什么意义?另外,编译器不会处理这个吗?

编辑:嗯……哪个答案可以接受……两者都很好!

4

2 回答 2

8

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

例如:

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

这将打印零,因为 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

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

于 2013-03-22T23:54:44.017 回答
7

在您的代码段中,只是一个作业,您不需要“f”后缀,实际上您不应该使用它。如果 CGFloat 是单精度(如在 iOS 中),那么您的值将存储为单精度,带或不带“f”,如果 CGFloat 是双精度(如在 Mac OS 上),那么您将不必要地创建一个单精度值存储双精度。

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

于 2013-03-22T23:55:33.593 回答