使用'> ='代替'=='在使用浮动以外的其他类型编码时是否更加安全?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

使用浮点时应该使用

a <= 0.0

代替

a == 0.0

确保您获得所需的行为,因为使用浮点变量时存在舍入错误的问题。

但是当使用其他变量类型时,这样int做会有用吗?就像你有一个for循环遍历int变量(如索引),当它到达一个数字时,它应该做一些事情。您是否应该将比较设置为>=而不是==何时应该产生相同的输出?就像==在以下情况下不会评估的情况一样:

for (int i = 0; i < 10; i++)
{
    if (i == 5)
    {
        break;
    }
}

而且,做以下事情会更“安全”:

for (int i = 0; i < 10; i++)
{
    if (i >= 5)
    {
        break;
    }
}

如果两者在编码“安全”方面没有区别,那么是否有任何性能或可读性差异或其他可以在编码方式之间做出选择的事情?

试图谷歌这个,但找不到任何说明的方式。但这可能与搜索运营商的问题有关。

问这个我是不是太偏执了?

提问于
用户回答回答于

就像曾经存在不评估==的情况一样

不,使用==是安全的。整数表示精确使用的整数类型范围内的所有值。没有惊喜。

然后,您应该将比较设置为> =而不是==

结果是一样的,你可以做到这两点,但我会发现>=令人困惑。所以为了便于阅读,我更喜欢==

有没有表现。。。这可以使人们在编码方式之间做出选择

你不能通过查看C代码来判断。这取决于所使用的系统(CPU)。但总的来说,我会怀疑你会遇到任何重大差异。

用户回答回答于

这个问题的前提是错误的; 盲目地使用a <= 0.0而不是a == 0.0浮点数的有效实践。请参阅比较浮点值有多危险?用于治疗该主题。

话虽如此,在某些情况下,使用不等式关系运算符比使用等式运算符“更加强硬”,反之亦然。一般来说,我会建议反对它,因为它可能会给你一种虚假的安全感 ; 例如,在使用i==5vs 的问题的示例中i>=5,编译器可能能够证明它们是相同的,并且如果需要可以优化到另一个。这意味着它不一定会做任何事情来保护你免受堆栈溢出或中微子或任何其他原因的影响,在i该语言定义的语义之外,其值可能会超过0..5。

在某些情况下,平等的使用是由不平等定义的,特别是涉及指针。如果posend都是指针,pos==end只要它们都是有效的,就可以很好地定义。但是如果它们都是null,而且pos==end定义明确且是真的,pos>=end则是未定义的行为。同样,如果它们都指向不同的数组(特别是如果end指向不是数组的一部分的标记),pos==end则始终为false,但是pos>=end未定义的行为。

if (i>=5)当你知道i>5在逻辑上是不可能的时候,我也会发现写作会产生误导- 这会让读者停下来思考它是否可能,如果没有,为什么你这样写而不是if (i==5)

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    7 粉丝1 提问10 回答
  • 四无君

    0 粉丝0 提问3 回答
  • 旺仔小小鹿

    社区 · 运营 (已认证)

    46 粉丝0 提问2 回答
  • 拉布拉多拉不多

    1 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券