在许多语言中,例如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");
}
}
}
这里产生编译错误,就像许多其他语言一样。
这肯定是语言语法产生的错误。但为什么语法会禁止这样的比较呢?从程序员的角度来看,使用比较运算符的等号的哪一侧应该无关紧要。
因为两个比较器都在等于左侧的运算符,所以语法分析是线性完成的(从左到右,反之亦然)。但为什么这个命令很重要?
答案 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中也非常气馁。