在切换或有条件期间与'else'相反

时间:2015-10-08 14:21:55

标签: language-agnostic

我想知道是否有任何编程语言都有这样的运算符(ALWAYS是占位符 - 我在问什么语言有ALWAYS

if a
  doAStuff()
else if b
  doBStuff()
ALWAYS
  //runs if a or b is true
  win()
else
  doElse()

基本上,与else相反。如果语句中的其他内容运行,它就会运行。

从逻辑上讲,就像这样

always = true
if a
  doA()
else if b
  doB()
else
  always = false
  doElse()
if always
  win()

是否有任何语言将该逻辑内置到关键字中,例如第一个示例中的ALWAYS

2 个答案:

答案 0 :(得分:1)

不是'语言不可知'。更像是“找我的语言”。使用Forth和Lisp,您可以自然地将这样的构造添加到语言中,并且它将像现有构造一样工作。我不知道默认情况下有任何语言。如果你的语言可扩展性比Forth或Lisp少,那么自然的方法是使用本地函数(如果你有一流的函数)或者在显示时设置一个标志,或者将代码设置为这两种情况都可以作为成对对待,而不需要很多重复。

所以,在JavaScript中:

;(function() {
  function both() { win(); more stuff, potentially }
  if (a) { doA(); if (b) both() }
  else if (b) { doB(); if (a) both() }
  else neither()
})()

在阅读之后,应该清楚的是,“两个”情况永远不会发生在第二个区块中。所以这简化为:

;(function() {
  function both() { win(); more stuff, potentially }
  if (a) { doA(); if (b) both() }
  else if (b) doB()
  else neither()
})()

这似乎不值得努力。因此,似乎更不值得语言功能。为什么不进一步写下来呢?

if (a) { doA(); if (b) { win(); more stuff, potentially } }
else if (b) doB()
else neither()

如果b是一项昂贵的测试,只需保存结果即可。如果b之前不得测试a,请保存两个结果。显然,两个测试都必须始终运行。

;(function() {
  var a = testA(),
      b = testB()
  ... as above ...
})()

至于最后一个选项,“将代码视为两个条件可以被视为成对的因素”,你要找的是:

if (a && !b) doA()
if (!a && b) doB()
if (a && b) { doA(); doB(); win() }  // or no doB() if you really want that
if (!a && !b) neither()

如果您愿意,请else if。我实际上更喜欢这种选择模式匹配语言。如果你忘记了四种可能结果中的一种,Mercury甚至会抛出编译时错误。

答案 1 :(得分:0)

不确定这是否是您正在寻找的,但是一个简单的do-while循环将始终至少在Java中运行一次。