确定if条件中使用的布尔表达式中哪个条件为真

时间:2018-06-23 10:11:40

标签: javascript c# python

假设我们有一个简单的boolean表达式,其中填充了布尔返回类型函数调用,并且它们之间有logical OR个运算符。此boolean表达式仅在单个if子句中使用。例如:

if (c1() or c2() or c3()): #c1(), c2(), c3() are sample boolean return type methods
  foo1()
  foo2()
  print ("foo1() and foo2() have been executed because condition # <number> is true")
  1. 是否有可能找出方法调用( c2()之类的条件是条件#2),因此 程序在if子句中输入了代码而不存储了 返回任何方法调用或再次调用任何方法的值?
  2. 假设c1()c2()c3()都将返回true 布尔值。但是由于short-circuit boolean evaluationc2()c3()将永远不会执行。我们可以通过某种条件/方法调用以某种方式找到它吗,在应用第1点中提到的相同条件时,程序可能仍在if子句中进入了代码块。

答案可以是任何编程语言。我只是想知道它是否可行以及如何实现。

5 个答案:

答案 0 :(得分:0)

由于某些原因,您同时在pythonc#上进行了标记,每种语言的答案可能完全不同。

在C#中,我将按照以下模式进行操作:

public ResultModel checkSomething()
{
    ResultModel retVal = new ResultModel();

    if(condition1)
    {
        retVal.DidSucceed = true;
        retVal.Source = eSource.Condition1;
    }
    else if (condiction2){
        ...
    }

    return retVal;
}

class ResultModel
{
    public bool DidSucceed {get;set;}
    public eSource Source {get;set;}
}

答案 1 :(得分:0)

这是在Python中执行此操作的方式,

condn = 0
for i, c in enumerate((c1(), c2(), c3()):
    if c:
        condn = i + 1
        break
if condn:
  foo1()
  foo2()
  print("condition number #{} is true".format(condn))

# if c2() is true, it prints
"condition number #2 is true"

答案 2 :(得分:0)

您可以做一些棘手的事情,但不是最好的解决方案

check = []
def c1():
    global check
    if True: check.append('c1')

答案 3 :(得分:0)

第一个问题的答案是否定的,只要其中一个函数返回true,if内的代码就会执行,并且如果没有调试器或将值存储在变量中就看不到值是什么。

答案 4 :(得分:0)

要获得这种行为而又不污染全局变量的名称空间或将c*函数转换为类,我可以这样实现:

conditions = [c1, c2, c3]
for index, cond in enumerate(conditions):
    if cond():
        foo1()
        foo2()
        print(f"foo1() and foo2() have been executed because condition {index} is true")
        break

这基本上是对or行为进行硬编码,但除此之外没关系。