首先,我的编程语言名为 Ignite,是一种转译的编程语言,并将 Ignite 源文件转换为 C++ 源文件。
链式比较运算符是指将比较运算符(例如
<=
、!=
、>
等)链接在一起,这意味着在单个表达式中使用多个这些运算符,而无需引入其他逻辑运算符将他们分开。一个例子是:x < y < z
。
问题是我要执行什么黑魔法才能将此表达式解释为 C++ 中的有效表达式,使其与数学一致?
对于 Python,它只是简单地在链式运算符之间添加一个 AND 表达式,因此
x < y < z
将变为 x < y && y < z
。它适用于像这样的简单情况。我最初的想法是一次只允许一个比较运算符,因此如果您使用 <
作为链中的第一个运算符,则必须在链中的后续运算符中仅使用 <
。但这并不理想,因为您可以将此表达式 x < y <= z
作为有效的数学表达式。
好吧...那么如果我允许混合运算符,
x < y > z
是一个有效的运算符链,但在数学中没有意义(如果我错了,请纠正我)。这将被解释为 x < y && y > z
。
但是如果你的表达是
x != y != z
怎么办?这是一个有效的数学表达式,表示“x、y 和 z 彼此不相等”。但将其解释为 x != y && y != z
并不是最好的描述,因为 x
仍然可以等于 z
。
我想出的是将其解释为
x != y && x != z && x != y
,即将所有变量与除自身之外的所有其他变量进行比较。当您有相同类型的操作员时,这很有效。但很快就成为 x < y <= z
的问题。在口译时,您会使用哪两个(<
或 <=
)来比较 x
与 z
?
所以我继续使用这两个运算符并对它们进行 OR 运算,因此它将其解释为
x < y && (x < z || x <= z) && y <= z
。但是现在,如果您有一个有效的数学表达式 x == y == z != 1
,意思是“x、y 和 z 都相等但不等于 1”,该怎么办?使用我的逻辑会导致表达式x == y && x == z && (x == 1 || x != 1) && y == z && (y == 1 || y != 1) && z != 1
...想一想,它有效...但是有更好的方法吗?
谢谢。
您不必以同样的方式对待所有运营商链。
如果您确实想将
x != y != z
定义为 x != y && x != z && x != y
,这并不妨碍您将 x < y <= z
定义为 x < y && y <= z
,并将 x < y > z
定义为语法错误。