只使用 <= 和 >= 形式(不包括 =< 和 =>)进行比较的原因是什么?

What reasons are there for having comparisons be only of the form <= and >= (and not including =< and =>)?

在许多语言中,例如 Java 和 C/C++,比较总是以 <=>= 的形式进行。例如,这是一个工作示例程序:

import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        // Get inputs
        int input1 = s.nextInt();
        int input2 = s.nextInt();

        // compare them
        if (input1 >= input2) {
            System.out.println("Input 1 is greater than or equal to input 2");
        } else {
            System.out.println("Input 1 is less than input 2");
        }
    }
}

这可以正确编译和运行。但是,如果我将比较线更改为:

import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        // Get inputs
        int input1 = s.nextInt();
        int input2 = s.nextInt();

        // compare them
        if (input1 => input2) { // ------Changed this line------
            System.out.println("Input 1 is greater than or equal to input 2");
        } else {
            System.out.println("Input 1 is less than input 2");
        }
    }
}

它会在此处产生编译器错误,就像在许多其他语言中一样。

这肯定是语言语法产生的错误。但是为什么语法会禁止这样的比较呢?从程序员的角度来看,比较运算符用在等号的哪一边应该无关紧要。

因为两个比较运算符都在等号的左侧,所以语法分析是线性进行的(从左到右,反之亦然)。但为什么顺序很重要?

因为虽然 => 是一个有效的数学比较器,但它不是一个有效的语言标记。

编译器在编写时做出了很多妥协。不支持等号和大于号的所有组合只是使语言解析更快的妥协之一。

--- 更新了上面提到的复杂性的几个例子 ---

对于 C++,从表面上看这会是一个 "easy fix";解析器将为两个输入创建相同的 "GreaterThanOrEqual" 标记;然而,它并不像看起来那么容易,当一个人可以通过编写 operator>=(...) 方法来覆盖 "GreaterThanOrEqual" 标记的行为时。

是否应该提供两个 operator>=(...)operator=>(...) 覆盖方法?是否需要某种机制使它们相同?如果你只定义一个而没有另一个,另一个是否应该 "aliased" 回到定义的那个?人们可以很容易地看出它会如何增加很多极端情况的复杂性。

发生这种情况的原因有多种。 (请注意,这完全基于意见和个人经验。)

很大程度上与常见的做法和代码的易读性有关。它还降低了编译器的复杂性,因为它们不必检查一堆不同的情况。 (如果你添加那个特定的案例,它们还有更多的可能性需要考虑。)这对于像 C/C++ 这样的语言来说可能会有问题,因为它们有数百个甚至数千个独特的编译器。 (尝试让它们都遵循标准可能已经够难了,不必要的复杂化不太可能有帮助。)

很好奇其他人对这个问题的看法。

编辑:正如其他人在我输入此答案后评论的那样,它也在其他语言中用于表示完全不同的操作。

有些语言您实际上可以定义自己的 "operators"。更准确地说,在 Java、C/C++ 等语言中,这些运算符是 "built in"。然而在像 Smalltalk 这样的语言中,没有运算符的概念。一切都是对象及其方法。因此,即使像您这样的操作员也可以定义自己的 "operators"。话虽如此,我必须补充一点,尽管您可以自由地覆盖或添加这样的新运算符,但在 Smalltalk 中也是非常不鼓励的。

简而言之,整个语言的可读性。

想象一个初学者尝试学习,并在他的所有 类 中使用 >=。 (因为这是标准。)

然后,他走到野外,被突然引入的 =>(也有点像箭头。)弄糊涂了。

更糟糕的是,想象一个大型企业级项目,其中一半的编码人员使用 >=,一半使用 =>,代码将是一个巨大的集群 $SWEARWORD.

这和我们没有IF, WHEN, ISTRUE, EXECUTEASLONGAS的原因是一样的,我们只有IF