c语言 - 在使用浮点数以外的其他类型的编码时,是否应该使用 '>=' 而不是 '==' 来更加安全?



使用浮点时,应该使用

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;
}
}

如果在编码"安全"方面两者之间没有区别,是否有任何性能或可读性差异或其他因素可以使人们在编码方式之间进行选择?

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

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

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

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

还有一些情况下,平等的使用不是由不平等来定义的,特别是涉及指针。如果posend都是指针,则只要它们都有效,pos==end就是明确定义的。但是,如果它们都是 null,而pos==end是明确定义的和 true,则pos>=end是未定义的行为。同样,如果它们都指向不同的数组(特别是如果end指向不属于数组的哨兵(,pos==end将始终为 false,但pos>=end是未定义的行为。

我还发现,当你知道i>5逻辑上是不可能的时,写if (i>=5)是误导性的——它让读者停下来思考它是否可能,如果不是,为什么你这样写而不是if (i==5)

答案是,这取决于。 如果你有一个这样的循环:

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

那么i跳过5就没有危险了.

另一方面,如果您有这样的东西:

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

然后i可能会在程序的正常流程之外发生变化(例如,由于中断(。 在这种情况下>=谨慎

就像有

没有计算 == 的情况

一样

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

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

由于结果相同,您可以同时执行这两项操作,但我会发现>=令人困惑。所以为了可读性,我更喜欢==

有没有表现。。。可以让人在编码方式之间进行选择

你无法通过查看 C 代码来判断。这取决于所使用的系统 (CPU(。然而,总的来说,我怀疑你是否会经历任何重大差异。

最新更新