我刚刚遇到以下代码:
if(someInt <= int.MinValue) { /* ... */ }
我想知道我是否遗漏了一些使用<=
比较比使用更直观的==
比较更好的微妙之处?
答案 0 :(得分:9)
这是循环中使用的常用方法 - 而不是(例如)
if (value == max)
break;
使用
if (value >= max)
break;
虽然您知道值“永远不应该”大于max,但如果程序逻辑的某些部分错误,并且值传递为(max + 12),会发生什么?第一种情况将尝试在32位系统上循环40亿次;第二种情况一旦意识到你已经通过“最大”位置就会退出。
因此,它是一种更健壮的方式来说同样的事情,因为当一切设置正确时它会起作用,但是当某人搞砸时它也会起作用(或者至少不会发生灾难性的失败)。处理器可以在内部类型执行==的同时执行&gt; =因此没有性能差异。但是,在将Int与Int.MinValue进行比较时使用&lt; =是多余的(虽然无害),因为在技术上不可能使值小于Int中的值。当然,Int64仍然可以小于Int32.MinValue。
所以我认为这是编码员的“习惯之力”。或者他们不相信Int.MinValue返回最小值: - )
答案 1 :(得分:5)
这是int的最小可能值,似乎没有什么可错过的。使用最直观地读取的代码。
答案 2 :(得分:5)
此外,如果someInt
将某一天更改为long
,则可能有意义。
答案 3 :(得分:2)
我会说这是一个错误(或者可能是已经改变的遗留物的遗留物,即它最初是int.MinValue以外的值)。
&lt; =与==有着完全不同的含义,只是因为在这个例子中他们实现了同样的事情,我总是写出能够传达代码最清晰意图的东西 - 否则像你这样的人来后来维护它并且必须发布一个SO问题,询问为什么原始开发人员会这样做:)
答案 4 :(得分:1)
它更清楚。 someInt永远不应该&lt; int.MinValue,但是如果它 你不希望测试突然变得错误吗?
通常,当我的代码包含边界测试时,我总是使用&lt ;,&lt; =,&gt;或&gt; =而不是==。即使不可能超出边界。这使 intent 更清晰。
答案 5 :(得分:1)
没有意义。 someInt不可能小于int.MinValue,==就足够了 使用&lt; =只会令人困惑。
答案 6 :(得分:1)
此处的行为相同,但假设您稍后将int.MinValue
更改为其他一些小值。使用<=
意味着稍后更改。
答案 7 :(得分:0)
如果someInt
递减了一些任意数量,则上述代码更有意义。
答案 8 :(得分:0)
我已经看到这种方法被提倡,因为如果出现问题(例如内存损坏),条件仍会触发。这在你的情况下并不是那么有用,但在其他情况下,例如循环计数到10并且内存损坏将值设置为-500,它仍将终止(而不是永远循环,或直到它翻转这可能是很长一段时间)。我不确定我是否认为这是合理的,因为在我看来,处理这类错误的编程很少会做正确的事。
答案 9 :(得分:0)
int.MinValue默认使用Int32类型的最小值。
你的代码很好。我不确定变量someInt的初始化。它可以是Int16,Int32或Int64(可以小于int.MinValue)。