gpt4 book ai didi

c - 在使用 float 以外的其他类型进行编码时,是否应该使用 '>=' 而不是 '==' 来更加安全?

转载 作者:行者123 更新时间:2023-12-01 12:09:43 26 4
gpt4 key购买 nike

在处理 float 时应该使用

a <= 0.0

代替

a == 0.0

确保您获得所需的行为,因为 round-off errors 存在问题使用浮点变量时。


但是当使用像 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不是 float 的有效做法。参见 How dangerous is it to compare floating point values?对该主题的处理。

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

还有一些情况下,不等式的使用不是由不等式定义的,特别是涉及指针时。如果posend都是指针,pos==end定义明确,只要它们都有效。但是如果它们都是空的,而 pos==end定义明确且真实,pos>=end是未定义的行为。同样,如果它们都指向不同的数组(特别是如果 end 指向一个不属于您的数组的哨兵),pos==end永远是错误的,但是 pos>=end是未定义的行为。

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

关于c - 在使用 float 以外的其他类型进行编码时,是否应该使用 '>=' 而不是 '==' 来更加安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52935297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com