Objective-C / C中编号/浮点数之后的“f”

我在苹果文档中找不到这个:这里数字后面的“f”表示什么? 这是来自C还是Objective-C? 没有把这个加到常数上有什么区别吗?

CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f); 

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

 CGRect frame = CGRectMake(0, 0, 320, 50); 
 CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f); 

使用浮点常量。 (常量0.0通常在Objective-C中声明一个double;在最后加上f – 0.0f – 将常量声明为一个(32位)float。

 CGRect frame = CGRectMake(0, 0, 320, 50); 

使用ints将被自动转换为浮动。

在这种情况下,两者之间没有(实际的)区别。

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

 #import <Cocoa/Cocoa.h> void test() { CGRect r = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f); NSLog(@"%f", r.size.width); } 

然后用-S选项将它编译成汇编器。

 gcc -S test.m 

将汇编程序输出保存在test.s文件中,并从常量中删除.0f并重复编译命令。 然后做一个新的test.s和以前的testing。 认为应该表明是否有任何真正的差异。 我觉得太多的人都有他们认为编译器的想法,但是最后一个人应该知道如何validation任何理论。

有时候是有区别的。

 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. */ 

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

 3.0f -> float 3.0 -> double 3 -> integer 

源代码中的浮点文字被parsing为double。 将它赋值给一个floattypes的variables将会失去精度。 很多精确度,你扔掉7个有效数字。 “f”后缀让你告诉编译器:“我知道我在做什么,这是有意的,不要误解我的意思。

产生bug的几率不是那么小。 很多程序都是在浮点比较不正确的情况下进行的,或者假设0.1是完全可以代表的。

你正在谈论的f可能意味着告诉编译器它正在使用一个浮点数。 当你省略f ,通常会翻译成double。

两者都是浮点数,但floatdouble精度要less(因此精度较低)。

这是一个C的东西 – 浮点文字默认是双精度(双)。 添加一个f后缀使得它们具有单精度(浮点数)。

您可以使用整数来指定这里的值,在这种情况下,它将没有什么区别,但使用正确的types是一个好习惯 – 一致性通常是一件好事,如果您以后需要更改这些值乍一看,他们会知道他们是什么types的。

从C.它意味着浮动字面常量。 您可以省略“f”和“.0”,并在您的示例中使用整数,因为将int隐式转换为浮点数。

这几乎肯定来自C,反映了使用“浮动”而不是“双”的愿望。 它与数字后缀L相似,表示它们是长整数。 你可以使用整数,编译器会自动转换(对于这个特定的场景)。

它通常告诉编译器该值是一个float ,即浮点整数。 这意味着它可以存储整数,十进制值和指数,例如1.2e+221.2e+22