有什么理由比较只有形式< =和> =(并且不包括=<和=>)?

时间:2015-06-29 20:48:54

标签: 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");
        }
    }
}

这里产生编译错误,就像许多其他语言一样。

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

因为两个比较器都在等于左侧的运算符,所以语法分析是线性完成的(从左到右,反之亦然)。但为什么这个命令很重要?

4 个答案:

答案 0 :(得分:5)

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

撰写编译器会造成很多妥协。不支持equals和大于符号的每个组合只是使语言解析更快的妥协之一。

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

使用C ++,从表面上看,这似乎是一个“简单的修复”;解析器将为两个输入创建相同的“GreaterThanOrEqual”标记;但是,当用户可以通过编写operator>=(...)方法覆盖“GreaterThanOrEqual”标记的行为时,它并不像看起来那么容易。

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

答案 1 :(得分:0)

出现这种情况有几个原因。 (请注意,这纯粹基于观点和个人经验。)

很多与常规练习和易于阅读代码有关。它还降低了编译器的复杂性,因为它们不必检查一堆不同的情况。 (如果添加特定情况,则需要考虑更多的可能性。)对于像C / C ++这样的语言来说,这可能会有问题,因为它们是数百甚至数千个独特的编译器。 (尝试将它们全部按照标准进行操作可能很难,不必要的并发症也不太可能有所帮助。)

非常好奇地看到别人对这个问题的看法。

编辑:正如其他人在我输入这个答案时所评论的那样,它也用于其他语言以象征完全不同的操作。

答案 2 :(得分:0)

简单,整个语言的可读性。

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

然后,他走向野外,对于突然引入=>(也看起来像箭头)感到困惑。

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

这与我们没有IF, WHEN, ISTRUE, EXECUTEASLONGAS等原因相同。我们只有IF

答案 3 :(得分:-1)

有些语言可以让您真正定义自己的&#34;运算符&#34;。更准确地说,在Java,C / C ++等语言中,这些运算符&#34;内置&#34; 。但是在像Smalltalk这样的语言中,没有运营商的概念。一切都是一个对象及其方法。因此,即使像您这样的运营商也可以定义自己的&#34;运营商&#34; 。话虽如此,我必须补充一点,虽然你可以自由地覆盖或添加类似的新运算符,但在Smalltalk中也非常气馁。