我相信如果可能,我应该少打字。任何不必要的击键都需要一点时间。 在Objective-C的背景下,我的问题是:
我可以输入此
[UIColor colorWithRed:0 green:0 blue:0 alpha:0.15];
[UIColor colorWithRed:0.45 green:0.45 blue:0.45 alpha:0.15];
还是必须使用f后缀
[UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.15f];
[UIColor colorWithRed:0.45f green:0.45f blue:0.45f alpha:0.15f];
1)为什么即使没有“f”也能正常工作?
2)如果我需要写f,我是否还有“0”的异常,这意味着如果它为零,没有“f”仍然可以吗?
答案 0 :(得分:6)
你真正要问的是类型文字和隐式投射。
我还没有写过C,但是this reference让我相信它与C#没什么不同(我不能谈论目标-c)
问题归结为:
0.0
是值0
的文字表示法double
0.0f
是值0
的文字表示法float
0
是值0
的文字表示法int
在预期int
时提供float
是正常的,因为存在从int
到float
的隐式强制转换编译器可以使用。
但是,如果您在预期double
时指定float
,则不会进行隐式转换。这是因为从double
到float
的精度会有所下降,并且编译器希望您明确说您已经意识到这一点。
因此,如果您在预期0.0
时编写float
,那么期望您的编译器向您抱怨精度损失:)
<强> P.S。强>
我相信如果可能,我应该少打字。任何不必要的击键都需要一点时间。
我不会太担心击键次数。对于生活中不清楚的代码,您将浪费更多的时间,而不是打字。如果你有时间的话,最好的办法就是写下清晰明确的代码。
答案 1 :(得分:1)
键入0
时,它是一个整数常量。如果你将它分配给一个浮点数,它会自动提升:这类似于一个类型转换,但编译器会自动执行。
当您键入0.0f
表示&#34;零浮点&#34;它直接分配给float变量。
在这种情况下,两种方法之间没有任何有意义的区别。
答案 2 :(得分:1)
你问这个问题的事实表明你应该明确,尽管有额外的击键。任何程序员在开始处理某些代码时想要做的最后一件事就是&#34; WTF正在这里发生&#34;。代码的阅读频率高于编写代码,您只是证明了具有您经验水平的人可能不知道代码的作用。
是的,它会起作用,不,这样做没有编译/运行时的缺点,但代码应该是为其他人而不是编译器编写的 - 编译器并不关心你写的垃圾无论如何,它都会做到最好。另一方面,其他程序员可能会举手并离开键盘。
答案 3 :(得分:0)
在这两种情况下,编译的代码都是相同的。 (使用LLVM 5.1,Xcode 5.1.1进行测试。)
编译器会自动将整数float
和double
文字转换为CGFloat
s。请注意,CGFloat
在32位上为float
,在64位上为double
,因此无论您使用0.15f
还是{{1},编译器都会进行转换}。
我建议不要担心这个。我的偏好是使用最少的字符,不是因为它更容易打字,而是因为它更容易阅读。