你好,一切都在标题中。该问题尤其适用于所有可能类似于 的值NSTimeInterval
,CGFloat
或任何其他浮点或双精度变量。谢谢。
编辑:我要求赋值而不是字符串格式。
编辑 2:问题确实是0
为 float 或 double 分配一个平原比任何有f
结尾的东西都要糟糕。
你好,一切都在标题中。该问题尤其适用于所有可能类似于 的值NSTimeInterval
,CGFloat
或任何其他浮点或双精度变量。谢谢。
编辑:我要求赋值而不是字符串格式。
编辑 2:问题确实是0
为 float 或 double 分配一个平原比任何有f
结尾的东西都要糟糕。
基本区别如下:
1.0
或者1.
是一个双常数
1.0f
是一个浮点常数
如果没有后缀,其中包含小数的文字 (123.0) 将被视为双精度浮点数。如果您将其分配或传递给单精度变量或参数,编译器将(应该)发出警告。附加f
告诉编译器您希望将文字视为单精度浮点数。
如果您正在初始化一个变量,那么它没有任何意义。编译器为您完成所有转换。
float a = 0; //Cast int 0 to float 0.0
float b = 0.0; //Cast 0.0 double to float 0.0 as by default floating point constants are double
float c = 0.0f // Assigning float to float. .0f is same as 0.0f
但是,如果您在表达式中使用这些,那么这很有意义。
6/5 becomes 1
6/5.0 becomes 1.2 (double value)
6/5.0f becomes 1.2 (float value)
如果您想了解目标 CPU 运行代码或它执行的二进制代码是否有任何差异,您可以轻松地将编译代码的命令行之一从 XCode 复制到命令行,修复缺少的环境变量并添加-S。这样你就可以得到汇编输出,你可以用它来比较。如果您将所有 4 个变体放在一个小的示例源文件中,您可以在之后比较生成的汇编代码,即使您不熟悉 ARM 汇编。
根据我的 ARM 组装经验(好吧...... 6 年前和 GCC),我会打赌 1ct 类似对寄存器进行异或运算以将其内容刷新为 0。
无论您使用 0.0、.0 还是 0.0f 甚至 0f 都没有太大区别。(有一些关于双精度和浮点数)您甚至可以使用 (float) 0。
但是 0 和一些浮点表示法之间存在显着差异。零总是某种类型的整数。当您可能需要浮点运算时,这可能会强制机器执行整数运算。
我没有一个方便的零的好例子,但我有一个一般的浮点/整数,前几天几乎让我发疯。
我习惯了 8-Bit-RGB 颜色 那是因为我作为摄影师的爱好以及我最近作为 html 开发人员的背景。所以我觉得很难适应可可风格的 0..1 分数的红色、绿色和黄色。为了克服这个问题,我想使用我习惯的值并将它们除以 255。
[CGColor colorWithRed: 128/255 green: 128/255 andYellow: 128/255];
那应该会给我一些不错的中灰色。但它没有。我尝试过的所有东西要么变成黑色,要么变成白色。首先,我认为这是由我使用此颜色的 UI 文本对象的一些未记录的缺陷引起的。花了一段时间才意识到这个常量值强制整数运算只能向上或向下舍入到 0 和 1。这个 expession 最终实现了我想要实现的目标:
[CGColor colorWithRed: 128.0/255.0 green: 128.0/255.0 andYellow: 128.0/255.0];
您可以使用更少的 .0 来实现相同的目标。但根据需要拥有更多它们并没有什么坏处。128.0f/(float)255 也可以。
编辑以响应您的“Edit2”:
float fvar;
fvar = 0;
对...
fvar = .0;
最后,它根本没有任何区别。fvar 将包含一个接近(但不总是等于)0.0 的浮点值。对于 60 世纪和 70 世纪的编译器,我猜想存在与fvar = 0
. 也就是说,编译器首先创建一个 int 0 ,然后必须在分配之前将其转换为 float 。今天的现代编译器应该比旧的编译器更好地自动优化。最后,我必须查看机器代码输出,看看它是否有所作为。但是,与fvar = .0;
您一起始终在安全站点上。