写入/传递值与浮点数“f”后缀之间是否存在差异?

时间:2014-04-11 13:09:36

标签: c objective-c

我相信如果可能,我应该少打字。任何不必要的击键都需要一点时间。 在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”仍然可以吗?

4 个答案:

答案 0 :(得分:6)

你真正要问的是类型文字和隐式投射。

我还没有写过C,但是this reference让我相信它与C#没什么不同(我不能谈论目标-c)

问题归结为:

  • 0.0是值0文字表示法double
  • 0.0f是值0文字表示法float
  • 0是值0文字表示法int

在预期int时提供float是正常的,因为存在从intfloat隐式强制转换编译器可以使用。

但是,如果您在预期double时指定float,则不会进行隐式转换。这是因为从doublefloat的精度会有所下降,并且编译器希望您明确说您已经意识到这一点。

因此,如果您在预期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进行测试。)

编译器会自动将整数floatdouble文字转换为CGFloat s。请注意,CGFloat在32位上为float,在64位上为double,因此无论您使用0.15f还是{{1},编译器都会进行转换}。

我建议不要担心这个。我的偏好是使用最少的字符,不是因为它更容易打字,而是因为它更容易阅读。