只使用 <= 和 >= 形式(不包括 =< 和 =>)进行比较的原因是什么?
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
。
在许多语言中,例如 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
。