Dyalog APL 16含赋值操作的逻辑表达式结果差异疑问
两段APL代码运行结果差异原因
核心差异来源于Dyalog APL中普通赋值←和修饰性赋值f←的返回值规则不同:
- 普通赋值
LHS ← RHS执行后,返回值是右操作数RHS的计算结果 - 修饰性赋值
LHS f← RHS执行后,返回值是赋值操作执行前左操作数LHS的原始值
第二段代码执行逻辑(结果为0)
代码如下:
P ← 1 1 0 Q ← 0 0 1 ∨/ P ← P ∧ Q
执行顺序:
- 先计算最右侧的
P ∧ Q:原始P为1 1 0,Q为0 0 1,按位与结果为0 0 0 - 执行普通赋值
P ← 0 0 0,赋值返回值为右操作数0 0 0 - 对返回值执行或归约
∨/:0∨0∨0 = 0,因此最终结果为0
第一段代码执行逻辑(结果为1)
代码如下:
P ← 1 1 0 Q ← 0 0 1 ∨/ P ∧← Q
执行顺序:
- 执行修饰性与赋值
P ∧← Q:- 先取赋值前P的原始值:
1 1 0 - 计算
原始P ∧ Q得到0 0 0,将该值赋值给P - 修饰性赋值返回值为赋值前P的原始值:
1 1 0
- 先取赋值前P的原始值:
- 对返回值执行或归约
∨/:1∨1∨0 = 1,因此最终结果为1
内容的提问来源于stack exchange,提问作者August Karlstrom
相关产品推荐
相关产品推荐

