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
.
难道只是为了确保转换double
到float
不会发生?这样做有什么意义?此外,编译器不会处理这个吗?
编辑:嗯......接受的答案......两者都非常好!
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完全改变结果.
在你的代码片段中,只是一个赋值,你不需要'f'后缀,实际上你不应该使用它.如果CGFloat是单精度(如在iOS中)那么你的值将存储单精度,有或没有'f',如果CGFloat是双精度(如在Mac OS上),那么你将不必要地创建一个单一的精度值存储双精度.
另一方面,如果你在做算术,你应该小心使用'f'或不使用它.如果你正在使用单精度并且包含一个没有'f'的文字'1.2'那么编译器会将其他操作数提升为双精度.如果你正在使用双精度并且然后包含'f'(就像Mac OS上的赋值一样),你将创建一个单一的精度值,只是让它立即转换为double.
归档时间: |
|
查看次数: |
2522 次 |
最近记录: |