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。
两者都是浮点数,但float
比double
精度要less(因此精度较低)。
这是一个C的东西 – 浮点文字默认是双精度(双)。 添加一个f后缀使得它们具有单精度(浮点数)。
您可以使用整数来指定这里的值,在这种情况下,它将没有什么区别,但使用正确的types是一个好习惯 – 一致性通常是一件好事,如果您以后需要更改这些值乍一看,他们会知道他们是什么types的。
从C.它意味着浮动字面常量。 您可以省略“f”和“.0”,并在您的示例中使用整数,因为将int隐式转换为浮点数。
这几乎肯定来自C,反映了使用“浮动”而不是“双”的愿望。 它与数字后缀L相似,表示它们是长整数。 你可以使用整数,编译器会自动转换(对于这个特定的场景)。
它通常告诉编译器该值是一个float
,即浮点整数。 这意味着它可以存储整数,十进制值和指数,例如1.2e+22
或1.2e+22
。