在Objective-C/C中的数字/浮点数后面的"f"

typ*_*ror 100 c floating-point objective-c

我在Apple文档中找不到这个:这里的数字后面的"f"表示什么?这是来自C还是Objective-C?不将它添加到常数中有什么区别吗?

CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
Run Code Online (Sandbox Code Playgroud)

你能解释一下为什么我不会写:

CGRect frame = CGRectMake(0, 0, 320, 50);
Run Code Online (Sandbox Code Playgroud)

Fra*_*rar 87

CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
Run Code Online (Sandbox Code Playgroud)

使用浮点常量.(常量0.0通常在Objective-C中声明一个double;在结尾处放置一个f - 0.0f - 将常量声明为(32位)float.)

CGRect frame = CGRectMake(0, 0, 320, 50);
Run Code Online (Sandbox Code Playgroud)

使用将自动转换为浮点数的整数.

在这种情况下,两者之间没有(实际)差异.

  • 从理论上讲,编译器可能不够智能,无法在编译时将它们转换为float,并且会通过四次int-> float转换(这是最慢的转换)来减慢执行速度.虽然在这种情况下几乎不重要,但如果需要,最好正确指定f:在表达式中,没有正确说明符的常量可能会强制整个表达式转换为double,如果它处于紧密循环中,性能命中可能是显. (24认同)

epa*_*tel 56

如有疑问,请检查汇编器输出.例如,写一个小的,最小的片段,就像这样

#import <Cocoa/Cocoa.h>

void test() {
  CGRect r = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
  NSLog(@"%f", r.size.width);
}
Run Code Online (Sandbox Code Playgroud)

然后使用该-S选项将其编译为汇编程序.

gcc -S test.m
Run Code Online (Sandbox Code Playgroud)

将汇编器输出保存在test.s文件中并.0f从常量中删除并重复编译命令.然后做一个diff新的test.s和前一个.认为应该显示是否存在任何真正的差异.我想太多人对他们认为编译器的作用有一个看法,但在一天结束时,人们应该知道如何验证任何理论.

  • +1"检查装配输出"!非常有用的提示,用于了解金属上的工作原理. (13认同)
  • 输出结果对我来说是相同的,即使没有任何`-O`.我在i686-apple-darwin10-gcc-4.2.1(GCC) (11认同)
  • 我试图上面的例子用LLVM版本7.0.0(铛-700.0.65)x86_64的-苹果darwin15.0.0和.OUT文件是相同的,以及. (2认同)

Pot*_*ter 42

有时候会有所不同.

float f = 0.3; /* OK, throw away bits to convert 0.3 from double to float */
assert ( f == 0.3 ); /* not OK, f is converted from float to double
   and the value of 0.3 depends on how many bits you use to represent it. */
assert ( f == 0.3f ); /* OK, comparing two floats, although == is finicky. */
Run Code Online (Sandbox Code Playgroud)


Nic*_*kLH 24

它告诉计算机这是一个浮点数(我假设你在这里谈论c/c ++).如果数字后面没有f,则认为是双精度或整数(取决于是否有小数).

3.0f -> float
3.0 -> double
3 -> integer
Run Code Online (Sandbox Code Playgroud)


Han*_*ant 5

源代码中的浮点文字被解析为双精度型。将其分配给float类型的变量将失去精度。非常精确,您丢掉了7位有效数字。“ f”后缀让您告诉编译器:“我知道我在做什么,这是有意的。不要为此烦我”。

产生错误的几率并不小。许多程序都考虑到了浮点数比较不当或假定0.1可以精确表示的情况。


Yur*_*uri 5

f你所谈论的是大概意思告诉编译器,它的工作有浮动。当您省略 时f,它通常被转换为双精度。

两者都是浮点数,但 afloat使用的位数比 a 少(因此更小且精度更低)double