您没有指定语言,但取决于语言,这可以通过多种方式重写
Ruby方式(使用spaceship operator):
case A <=> B
when -1 then... # A < B
when 0 then... # A = B
when 1 then... # A > B
end
Perl、PHP7 和 Groovy 也有相同的运算符。许多其他语言具有类似的运算符或函数,用于相同的组合比较目的,例如cmp in Python 2, compare in OCaml and compareTo in Kotlin。 C# 没有该运算符,但它具有 IComparable 接口和 CompareTo 方法。
VB方式:
Select Case A
Case Is < B
...
Case Is = B
...
Case Is > B
...
End Select
在 C、C++ 和许多没有 CompareTo 方法的类 C 语言中,您可以使用这种方式
int cmp = (A > B) - (A < B);
switch (cmp)
{
case -1: ...
case 0: ...
case 1; ...
}
许多语言(如 Java)不允许您直接将比较结果用作数值。在这种情况下,您可以使用signum function
switch(Integer.signum(A - B))
您可以在 C 和 C++ 中轻松实现signum 函数like this
这些是针对高级语言的。在装配级别,事情更简单。在 x86 汇编中只需要一个比较,然后根据结果我们将跳转到相应的块,所以它是 不是 3 比较和编译器足够聪明来优化这个简单的情况。例如:
cmp eax, ebx
je EQUAL_TO ; jump if =
ja GREATER_THAN ; jump if >
; less than case's code
jmp END_CMP
EQUAL_TO:
; equal case's code
jmp END_CMP
GREATER_THAN:
; larger than case's code
END_CMP:
与其他具有比较标志(如 ARM 或 68k)的架构相同......
MIPS 示例:
beq $t0, $t1, EQUAL_TO # $t0 = A, $t1 = B; if ($t0 == $t1) equal();
slt $t0, $t1, $t2 # $t2 = is_less_than = ($t0 < $t1);
beq $t2, $zero, GREATER_THAN # if (!is_less_than) larger();
# "less than" code here
# ...
j END_CMP
EQUAL_TO:
# "equal" code
# ...
j END_CMP
GREATER_THAN:
# "larger" code
# ...
END_CMP:
对于具有条件指令的架构,例如 ARM 或 Itanium,并且 if-else 块中的主体足够简单您甚至可能不需要跳转