我有一种情况需要评估某些变量,但由于遗留问题,我无法访问IF ... ELSE。
是否可以仅使用&
,|
和!
以及基本数学创建IF评估。
var1 = 1;
var2 = 0;
var3 = 1;
Psuedo示例我正在尝试使用and,或者不是。没有其他要求。
assert[ if (var1 == 1) then { var2 == 1 OR var3 ==1 } ] is true or false
也
assert [ if ( var1 = 0 ) then { var2 == 0 AND var3 == 0 ) ] is true or false
我一直在尝试各种组合,但如果有意义的话,我无法找出如何基于错误结果否定真实。我不需要其他,只要第一个var1设置为1,那么另一个拖车需要为1.
因为这些是数字,我确信我需要进行某种计算,但是无法真正找到IF在低级别上的工作方式。
答案 0 :(得分:1)
if ((var1 and (var2 or var3)) or (!var1 and (!var2 and !var3)))
确定没有正确理解这个问题。为了在没有IF的情况下获得上述内容,您能否像这样拆分逻辑?我假设它不需要是一个单一的陈述。
varA = (var1 and (var2 or var3))
varB = (!var1 and (!var2 and !var3))
result = varA or VarB
答案 1 :(得分:1)
在具有逻辑AND和OR的短路评估的语言中,您可以使用它们来实现条件控制流,不需要if
语句。这似乎不是你在做什么。
您似乎想要测试含义。例如,
var1 => var2 OR var3
如果您的语言支持implication testing directly,您就完成了。否则,我将向您展示如何使用标准布尔运算符实现。
可以通过注意如果不满足左侧来测试这些,则会自动满足暗示。
NOT var1 => holds
此外,如果符合右侧,也意味着满意
var2 OR var3 => holds
把它放在一起:
holds := (NOT var1) OR var2 OR var3
第二个含义减少到
holds2 := var1 OR ((NOT var2) AND (NOT var3))
应用DeMorgan给出
holds2 := var1 OR NOT (var2 OR var3)
将它们放在一起:
both_hold := holds AND holds2
并简化
both_hold := ((NOT var1) OR var2 OR var3) AND (var1 OR NOT (var2 OR var3))
识别模式
both_hold := var1 XNOR (var2 OR var3)
(在类C语言中,XNOR可以在布尔变量上表示为==
)
但是,这些都不符合您的简单语言描述
如果第一个var1设置为1,那么另一个拖车需要为1
听起来更像是
text_holds := (var1 XNOR var2) AND (var2 XNOR var3)