我永远不明白为什么我们使用这样的语法:
if (a == b || a == c)
什么时候可以简化为:
if (a == b || c)
这是编译器或其他问题吗?我们真的可以不考虑这样的一串代码并让它起作用吗?
答案 0 :(得分:6)
没有任何技术限制可以使实现将a == b || c
视为a == b || a == c
的快捷方式的语言变得不可能(甚至太难)。问题在于,只有在预期的情况下,才能提出这样的规则。
例如,考虑表达式result == null || fileIsClosed
,其中fileIsClosed
是布尔值。当然,程序员不会期望将其视为result == null || result == fileIsClosed
。您可以提出其他规则,例如“仅当||
的右操作数不是布尔值时才应用替换”,但如果执行booleanResult == possibleResult1 || possibleResult2
,则替换也不起作用。事实上,关于这个例子的唯一事情就是告诉我们程序员是否打算进行替换,这是变量的名称。显然,编译器无法从变量名中推断出含义,因此在每种情况下都不可能做出用户想要的事情,制作简单的规则而没有例外(例如“expr1 || expr2
如果至少有一个{{{} 1}}和expr1
是真的“)更好。
总而言之:我们不希望在所有情况下进行替换,并且推断在哪些情况下替换是有意义的,完全准确是不可能的。由于应该很容易推理代码,实现一个可能会或可能不会根据90%的程序员不会知道或理解的规则应用替换的系统会在某些情况下导致混乱的行为,因此不是一个好主意
答案 1 :(得分:6)
答案的某些部分是: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)
现在人类编码这些线条的意图是什么? ...... *想。当被要求生成要在机器上执行的目标代码时,我们完全不知道也不知道编译器(正如开发人员所预期的那样)。
或更严重:编译器可以(并且应该)不像人类有时那样猜测。
答案 2 :(得分:1)
你可以,你只是使用错误的编程语言:)
例如,在Icon中,您可以撰写a = (b | c)
。有效的方式是|
真正连接序列,=
(相等)过滤它们(其中false是没有结果,true是一些结果)。它通过反向跟踪来实现这一点。
你可以做更疯狂的事情,比如write ((0 to 4) > 1) * 3
会打印6 9 12。
答案 3 :(得分:0)
你已经知道你写的字符串会有不同的含义。但是,某些语言提供了扩展以更改运算符的行为。如果要定义自己的自定义操作,可以使用它。