为什么编程语言不使用简化的布尔表达式?
Why don't programming languages use simplified boolean expressions?
我一直不明白为什么我们使用这样的语法:
if (a == b || a == c)
什么时候可以简化成这样:
if (a == b || c)
这是编译器的问题还是什么的?我们真的可以不解释这样一串代码并让它工作吗?
如您所知,您所写的字符串会有不同的含义。然而,一些语言提供扩展来改变运算符的行为。如果您想定义自己的自定义操作,可以使用它。
没有任何技术限制会导致不可能(甚至太难)实现将 a == b || c
视为 a == b || a == c
的快捷方式的语言。问题是,几乎(?)不可能仅在符合预期的情况下制定规则。
例如,考虑表达式 result == null || fileIsClosed
,其中 fileIsClosed
是一个布尔值。程序员肯定不会期望这会被视为 result == null || result == fileIsClosed
。你可以想出额外的规则,比如 "the replacement is only applied if the right operand of ||
is not a boolean",但是如果你这样做 booleanResult == possibleResult1 || possibleResult2
,替换也不起作用。事实上,关于这个例子,唯一能告诉我们程序员是否打算进行替换的就是变量的名称。显然,编译器无法从变量名中推断出含义,因此不可能在每种情况下都做用户想要的事情,制定没有例外的简单规则(比如“expr1 || expr2
是 true iff 至少一个 expr1
和 expr2
是真的") 更可取。
总而言之:我们不希望在所有情况下都进行替换,并且不可能完全准确地推断在哪些情况下替换有意义。由于对代码进行推理应该很容易,因此根据 90% 的程序员不知道或不理解的规则,实现一个可能会或可能不会应用替换的系统会在某些情况下导致混淆行为,因此不是一个好主意.
部分答案是:if (a == b || c)
如果没有上下文或不知道此表达式背后的含义,将无法解释。
考虑以下情况:
如果 c
本身就是一个布尔表达式或布尔值怎么办?它可以被解释为:
if (a has the value of b OR c is true)
if (a has the value of b OR c)
现在人类编写这些行的意图是什么? ... *思考。当要求编译器生成要在机器上执行的目标代码(如开发人员的意图)时,我们不完全知道,也不知道编译器。
或者更彻底:编译器可以(并且不应该)像人类有时那样猜测。
可以,你只是使用了错误的编程语言:)
例如Icon,可以写成a = (b | c)
。工作方式是 |
真正连接序列,并且 =
(相等)过滤它们(其中 false 没有结果,true 是一些结果)。它通过 back-tracking.
实现
你甚至可以做更疯狂的事情,比如 write ((0 to 4) > 1) * 3
会打印出 6 9 12。
我一直不明白为什么我们使用这样的语法:
if (a == b || a == c)
什么时候可以简化成这样:
if (a == b || c)
这是编译器的问题还是什么的?我们真的可以不解释这样一串代码并让它工作吗?
如您所知,您所写的字符串会有不同的含义。然而,一些语言提供扩展来改变运算符的行为。如果您想定义自己的自定义操作,可以使用它。
没有任何技术限制会导致不可能(甚至太难)实现将 a == b || c
视为 a == b || a == c
的快捷方式的语言。问题是,几乎(?)不可能仅在符合预期的情况下制定规则。
例如,考虑表达式 result == null || fileIsClosed
,其中 fileIsClosed
是一个布尔值。程序员肯定不会期望这会被视为 result == null || result == fileIsClosed
。你可以想出额外的规则,比如 "the replacement is only applied if the right operand of ||
is not a boolean",但是如果你这样做 booleanResult == possibleResult1 || possibleResult2
,替换也不起作用。事实上,关于这个例子,唯一能告诉我们程序员是否打算进行替换的就是变量的名称。显然,编译器无法从变量名中推断出含义,因此不可能在每种情况下都做用户想要的事情,制定没有例外的简单规则(比如“expr1 || expr2
是 true iff 至少一个 expr1
和 expr2
是真的") 更可取。
总而言之:我们不希望在所有情况下都进行替换,并且不可能完全准确地推断在哪些情况下替换有意义。由于对代码进行推理应该很容易,因此根据 90% 的程序员不知道或不理解的规则,实现一个可能会或可能不会应用替换的系统会在某些情况下导致混淆行为,因此不是一个好主意.
部分答案是:if (a == b || c)
如果没有上下文或不知道此表达式背后的含义,将无法解释。
考虑以下情况:
如果 c
本身就是一个布尔表达式或布尔值怎么办?它可以被解释为:
if (a has the value of b OR c is true)
if (a has the value of b OR c)
现在人类编写这些行的意图是什么? ... *思考。当要求编译器生成要在机器上执行的目标代码(如开发人员的意图)时,我们不完全知道,也不知道编译器。
或者更彻底:编译器可以(并且不应该)像人类有时那样猜测。
可以,你只是使用了错误的编程语言:)
例如Icon,可以写成a = (b | c)
。工作方式是 |
真正连接序列,并且 =
(相等)过滤它们(其中 false 没有结果,true 是一些结果)。它通过 back-tracking.
你甚至可以做更疯狂的事情,比如 write ((0 to 4) > 1) * 3
会打印出 6 9 12。