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

标签 java c++ compiler-errors

在许多语言中,例如 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++,从表面上看这似乎是一个“简单的修复”;解析器将为两个输入创建相同的“GreaterThanOrEqual”标记;然而,当您可以通过编写 operator>=(...) 方法来覆盖“GreaterThanOrEqual”标记的行为时,事情并不像看起来那么容易。

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

关于java - 只使用 <= 和 >= 形式(不包括 =< 和 =>)进行比较的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31125305/

相关文章:

java - 正则表达式匹配情绪

java - 寻找合适的无限强度文件

php - 在领域驱动设计中,存储库模式是否维护对对象的引用?

visual-studio-2008 - ReflectedDefinition 属性的问题

Xcode 尝试在 iOS 设备上运行时出错

types - 类型错误和可判定性-编译器

java - Java 中的 protected 方法

java - 解析 http GET 响应体

c++ - 抛出异常但未在 C++ 程序中捕获

C++ Visual Studio 2008,delete() 操作使程序崩溃