char_x <(char_y + 1)== char_x <= char_y?

Pac*_*ier 11 java algorithm char

大家好,当我遇到这个(java.lang.Character)时,我正在浏览一些Java源代码:

public static boolean isHighSurrogate(char ch) {
    return ch >= MIN_HIGH_SURROGATE && ch < (MAX_HIGH_SURROGATE + 1);
}

public static boolean isLowSurrogate(char ch) {
    return ch >= MIN_LOW_SURROGATE && ch < (MAX_LOW_SURROGATE + 1);
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么作者将上限加1并做一个小于比较,而不是简单地做一个小于或等于比较?

我能理解它是否有助于提高可读性,但在这种情况下似乎并非如此.

我想知道上面的代码和这个代码有什么区别:

public static boolean isHighSurrogate(char ch) {
    return ch >= MIN_HIGH_SURROGATE && ch <= MAX_HIGH_SURROGATE;
}

public static boolean isLowSurrogate(char ch) {
    return ch >= MIN_LOW_SURROGATE && ch <= MAX_LOW_SURROGATE;
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*uel 2

也许作者试图与Dijkstra 的建议保持一致,将所有范围设为半开——起点是包容性的,终点是排他性的。

这里没有语义差异,但字节码中有一个细微的差异:(ch + 1)是一个int,因此第一个代码片段执行一个chartochar比较,然后执行一个inttoint比较,而第二个代码片段执行两个chartochar比较。这不会导致语义差异——隐式转换为更广泛的类型,因此任一代码片段都不存在溢出风险。

优化加法并将inttoint比较转换回 2 字节无符号int比较完全在 JIT 所做的优化范围之内,因此我没有看到任何特定的性能原因来选择其中一种而不是另一种。

我倾向于把这种事情写成

MIN_LOW_SURROGATE <= ch && ch <= MAX_LOW_SURROGATE
Run Code Online (Sandbox Code Playgroud)

这样,ch中间的值对读者来说就很明显,它ch正在外部值的范围内进行测试。