关于C#:数字后的“ f”

您所在的位置:网站首页 F表示什么码数 关于C#:数字后的“ f”

关于C#:数字后的“ f”

#关于C#:数字后的“ f” | 来源: 网络整理| 查看: 265

数字后的f表示什么? 这是C还是Objective-C的? 不将其加到常数上有什么区别吗?

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

你能解释为什么我不只是写:

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

使用浮点常量。 (常数0.0通常在Objective-C中声明一个双精度;在末尾加一个f-0.0f-将该常数声明为(32位)浮点数。)

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

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

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

相关讨论 从理论上讲,编译器可能不够聪明,无法在编译时将它们转换为浮点型,并且会通过四次int-> float转换(属于最慢的转换)来减慢执行速度。尽管在这种情况下几乎不重要,但是在需要时正确地指定f总是更好的方法:在表达式中没有正确说明符的常量可能会强制将整个表达式转换为双精度,并且如果其处于紧密循环中,则可能会降低性能显。

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

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

然后使用-S选项将其编译为汇编器。

1gcc -S test.m

将汇编器输出保存在test.s文件中,并从常量中删除.0f并重复执行compile命令。然后对新的test.s和先前的test.s做一个diff。认为这应该表明是否存在任何实际差异。我认为太多人对编译器的功能有所了解,但归根结底,应该知道如何验证任何理论。

相关讨论 结果对我来说是相同的,即使没有任何-O。我在i686-apple-darwin10-gcc-4.2.1(GCC)上 我使用LLVM 7.0.0(clang-700.0.65)x86_64-apple-darwin15.0.0尝试了上述示例,并且.out文件也相同。

有时会有区别。

1234float 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,则将其视为双精度或整数(取决于是否有小数)。

1233.0f -> float 3.0 -> double 3 -> integer 相关讨论 这个约定是C ++标准的一部分还是在编译器中找到? 据我所知,它是标准的一部分(如果我错了,请纠正我)。我能找到的最快的参考文献是open-std.org/jtc1/sc22/open/n2356/lex.html#lex.fcon,但如果您愿意寻找它们,可能还会有更多最新的参考文献。

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

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

您所说的f可能是要告诉编译器它正在使用浮点数。省略f时,通常会转换为双精度。

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

这是C的事情-浮点字面量默认情况下是双精度(double)。添加f后缀会使它们具有单精度(浮点数)。

您可以在此处使用int来指定值,在这种情况下,这没有什么区别,但是使用正确的类型是一种很好的习惯-一致性通常是一件好事,如果以后需要更改这些值,则可以乍一看它们是什么类型。

从C开始。它表示float常量。您可以省略" f"和" .0"并在示例中使用ints,因为int会隐式转换为float。

几乎可以肯定,它来自C语言,反映了使用"浮点数"而不是"双精度"类型的愿望。它类似于数字上的后缀,例如L,表示它们是长整数。您可以只使用整数,编译器将在适当的情况下自动转换(针对此特定方案)。

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3