问题标签 [expression-evaluation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
540 浏览

c++ - 涉及一元运算符的 C++ 中的表达式求值

在这些情况下,为什么 C/C++ 不按从左到右的顺序计算表达式:最初 x=1

如果执行正常评估(++ 的优先级高于 +),则结果应为 1 + 2 = 3

相似地:

为什么结果不同?

更多案例:

C/C++ 遵循什么规则呢?

0 投票
6 回答
7281 浏览

java - 为什么是“a^=b^=a^=b;” 不同于“a^=b;b^=a;a^=b;”?

我尝试了一些代码来交换 Java 中的两个整数,而不使用第三个变量,使用 XOR。

这是我尝试的两个交换功能:

此代码产生的输出是这样的:

我很想知道,为什么会有这样的说法:

和这个不一样?

0 投票
1 回答
216 浏览

java - 如何评估新编程语言的抽象语法树

我想为“新”语言设计一个编译器。新语言将有自己的语法并输出有效的 C 代码。也就是说,从伪代码生成 ac 代码。我设计了一个语法。执行递归下降解析并得到抽象语法树。例如,我得到了 if 结构树。如何将其映射到原始 c 代码?我可以执行按顺序遍历吗?

我读过 Aho Ullman 的书。解释器的执行和编译的区别是什么?我可以应用访客模式吗?

0 投票
1 回答
196 浏览

math - 计算表达式的对数,给定变量的对数

我必须以编程方式确定表达式的值:

仅使用以下值:

计算lx ily i中的每一个的反对数可能是不切实际的,也是不希望的......

有什么方法可以将这种评估分解为一个简单的总结?

编辑

我在某处看到了一个 C 函数,它以简单的求和方式进行计算:

为每对值添加返回值,这似乎给出了正确的答案。但我无法弄清楚它是如何以及为什么起作用的!

0 投票
1 回答
1368 浏览

java - Java strictfp 修饰符对现代 CPU 有影响吗?

strictfp根据 JLS,我知道修饰符对方法(和类)的含义:

JLS 8.4.3.5,strictfp 方法:

strictfp 修饰符的作用是使方法主体内的所有浮点或双精度表达式都显式地为 FP-strict(第 15.4 节)。

JLS 15.4 FP 严格表达式:

在 FP-strict 表达式中,所有中间值必须是 float 值集或 double 值集的元素,这意味着所有 FP-strict 表达式的结果必须是 IEEE 754 算术对使用单双格式表示的操作数预测的结果.

在非 FP 严格的表达式中,允许实现使用扩展指数范围来表示中间结果;粗略地说,最终效果是,在独占使用浮点值集或双精度值集可能导致上溢或下溢的情况下,计算可能会产生“正确答案”。

我一直在尝试想出一种方法来获得方法中的表达式与非strictfp方法中的表达式之间的实际差异strictfp。我在两台笔记本电脑上试过这个,一台配备 Intel Core i3 CPU,另一台配备 Intel Core i7 CPU。而且我看不出任何区别。

许多帖子表明,不使用的本机浮点数strictfp可能使用 80 位浮点数,并且在可能的最小 java double(最接近零)或最高可能的 64 位 java double 之上具有额外的可表示数字。

我在下面尝试了使用和不使用strictfp修饰符的代码,它给出了完全相同的结果。

实际上,我认为只有在将代码编译为汇编时才会出现任何差异,因此我使用-XcompJVM 参数运行它。但没有区别。

我发现另一篇文章解释了如何获取 HotSpot 生成的汇编代码(OpenJDK 文档)。我正在运行我的代码java -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly。第一个v * 1.0000001 / 1.0000001带有修饰符的表达式 ( ) 和没有修饰符的表达式strictfp相同,编译为:

该代码中没有任何内容可以像我预期的那样将每个步骤的结果截断为 64 位。查找 和 的 文档,他们都提到这些(SSE)指令在 64 位浮点值上运行,而不是我预期的 80 位值。因此,这些指令操作的双值集已经是 IEEE 754 值集似乎是合乎逻辑的,因此拥有和不拥有它没有区别。movsdmulsddivsdstrictfp

我的问题是:

  1. 这个分析正确吗?我不经常使用英特尔组件,所以我对我的结论没有信心。
  2. 是否有任何(其他)现代 CPU 架构(具有 JVM)在使用和不使用strictfp修饰符的操作之间存在差异?
0 投票
1 回答
60 浏览

bash - 计算表达式并将结果发送到 Windows Batch 中的另一个程序

我不知道如何用一句话说清楚,所以我举这个例子

重击:

首先,“ls -a”被评估并转换为它的输出。所以我们有了这条线

然后执行。

我怎样才能通过使用 windows 命令行来实现相同的目标?

PS:我需要在我的 IDE 进行构建时使用它,因此不能选择使用 PowerShell 或 CygWin

0 投票
1 回答
1622 浏览

haskell - 伊德里斯热切评价

Haskell中,我可能会if这样实现:

符合我的预期


Racket中,我可以实现这样的缺陷if

符合我的预期


Idris中,我可能会if这样实现:

这种行为让我感到惊讶

我希望 Irdis 表现得像 Racket,两个参数都被评估。但事实并非如此!

伊德里斯如何决定何时评估事物?

0 投票
2 回答
494 浏览

java - 使用嵌套赋值更新表达式中的引用

查看与此问题类似的示例代码:

这打印错误。为什么它不会因 NullPointerException 而失败?必须在 equals 方法运行之前处理分配,但是在评估整行之前,这不会影响调用 equals 的引用吗?

我没有看到它在 Java 语言规范中的哪个地方描述了这一点,我是否在某个地方错过了它?

0 投票
2 回答
1067 浏览

c++ - 用不同的符号表重新计算 Boost Spirit 解析的属性的最有效方法是什么?

我正在使用 Boost Spirit 在某些软件中实现功能,允许用户输入将重复应用于输入流的数学方程。输入流值表示为符号boost::spirit::qi::symbols,用户可以在其等式中引用这些符号。(例如out1 = 3 * in1 + in2

解析和编译用户方程对性能不敏感,但计算其输出值是因为它构成时间关键管道的一部分。

在文档中使用 Spirit 的标准方式是在解析输入时计算输入的输出(属性)。但是,在每次计算之间,只有符号( 、 等)的属性值out1in1发生变化,感觉可能有一种更有效的方法来实现这一点,也许是通过缓存表达式的抽象语法树并重复它。

给定一组新的符号值,重新计算这个(固定)方程的值的最有效方法是什么?

0 投票
1 回答
146 浏览

c# - 逻辑评估器

我有一个程序需要支持“用户选项”来确定它将如何覆盖文件,用户可以从“选项”中进行选择,这可能会导致多种组合,从而难以编写所有可能的“IF...ELSE 语句” ,这个复杂的结果评估很难编码,而且太长了,也让我抓狂!

我希望通过某种“解析”来解决这个问题,以更快、更有机的方式评估所有可能的结果,而无需长链 IF...ELSE 块

是我的程序选项中的内容:

http://i.stack.imgur.com/Ggpbl.png

例如:用户选择覆盖文件并选择选项“文件大小”并选择“>=”作为此选项的条件,并且还选择了“文件日期”加上“<=”,并选择了“或”,选择的所有选项都会产生类似“FILE >= x”或“FILE DATE <= x”的结果。

鉴于屏幕截图上的选项,用户可以创建各种可能的逻辑选项并使用“OR”和“AND”组合它们,还可以选择“>”、“<、>=、<=、=、<> ”。

这个小屏幕背后的复杂性是巨大的,我一直在研究如何解决这个问题,我听说过称为 Lambda 表达式和二叉树的东西,但我不知道它是否适用于我的问题,我想至少有有人指出我正确的方向,我什至不知道在谷歌搜索答案时如何正确分类我的“问题”:)

在此先感谢大家!