我有一个变量,它的值取决于其他变量。这种依赖性是以逻辑表达式的形式定义的。例如:如果有一个变量A,在它的数据类型中,会提到与其他变量的关系。ie: A= (B&&C)||D
现在,这需要进行表达式解析,我已经使用了JEP( Java expression parser)。
B、C、D的值可以是4.0、1.0和3.0。解析后A的值将是1.0。
这是否意味着jep内部检查赋值是否大于0,如果发现大于0,则将其视为1?
String formula = "(B && C)||D";
JEP jep = new JEP();
jep.addVariable("B", 4.0);
jep.addVariable("C", 1.0);
jep.addVariable("D", 3.0);
jep.parseExpression(formula);
Number value = jep.getValue();
System.out.println("Value: " +value);
-------------------------------------
output:
Value: 1.0虽然1.0的结果是我想要的,但我不明白它是如何在内部发生的。当我在纸上做这件事时,我会得到以下结果
4 && 1 = 0100
0001
--------------
0000
||3 0011
---------------
0011
So my paper method gives me 3.内部发生了什么?有人能给我提供一些见解吗?
发布于 2021-11-22 11:35:35
我假设您在这里谈论的JEP是由Singular System Inc;http://www.singularsys.com/jep/生产的Jep Java
我查阅了相关文档,得出的结论是它不是真正的Java (TM)表达式解析器。相反,它正在实现一种“类似Java”的表达式语言。
(例如,在真正的Java中,B、C和D将具有类型double,而(B && C) && D将是无效的……因为&&和||仅为boolean参数定义。)
似乎JEP将数字视为&&和||的真值,以及(可能)关系运算符==、!=、<等的结果。所以本例中的(B && C) || D)正在计算(true && true) || true),也就是true ...那就是1。
不幸的是,JEP的文档相当粗略。在JEP站点上的文档中,我找不到任何实际说明如何处理真值的内容。
另一个线索是,在(真正的)Java语言中,按位AND和OR运算符是&和|。此外,JEP在“按位运算符表”中支持这些运算符和其他运算符。
我建议你把这个表达改成(B & C) | D ...看看这是否会给你带来你所期望的结果。
https://stackoverflow.com/questions/70064677
复制相似问题