现金或信贷问题

时间:2010-05-12 17:27:12

标签: operators theory boolean if-statement

如果你去商店询问“现金或信用卡?”他们可能会简单地说“是”。当你提出OR声明时,这并没有告诉你任何事情。 if(cash || credit)

对于人类来说,他们可能会回答“两者”这个问题,或“只有{现金|信用}”。有没有办法(或运算符)强制a语句返回语句的TRUE部分?例如:

boolean cash = true;
boolean credit = true;
boolean check = false;

if(cash || credit || check)
{
    // In here you would have an array with cash and credit in it because both of those are true
}

我想指出,这是我正试图解决的问题。这是我在考虑的事情,并且想知道是否可能。我想不出我会拥有的实用应用程序。

9 个答案:

答案 0 :(得分:10)

在C#中,您可以使用设置了Flags属性的枚举来执行与此类似的操作。

[Flags]
enum MethodOfPayment
{
    None = 0,
    Cash = 1,
    Credit = 2,
    Check = 4
}

使用示例:

void Run()
{
    MethodOfPayment m = MethodOfPayment.Cash | MethodOfPayment.Credit;
    if (m != MethodOfPayment.None)
    {
        // You can now test m to see which values are selected.

        // If you really want the values in an array, you can do this:
        MethodOfPayment[] selected = getSelectedValues(m).ToArray();
        // selected now contains { Cash, Credit }
    }
}

// Helper method to get the selected values from the enum.
IEnumerable<MethodOfPayment> getSelectedValues(MethodOfPayment m)
{
    foreach (MethodOfPayment x in Enum.GetValues(typeof(MethodOfPayment)))
    {
        if ((m & x) != MethodOfPayment.None)
            yield return x;
    }
}

答案 1 :(得分:5)

在Scala中,您可以使用匹配语句

编写以下内容
def OneOrTheOther( _1:Boolean, _2:Boolean ) = {
    (_1, _2) match{
        case True, False => //do stuff
        case False, True => //do stuff
        case True, True =>  //do stuff
        case False, False =>//do stuff
     }
}

我喜欢比赛表达。

答案 2 :(得分:3)

这是使用位掩码的目的。这是一个很好的概述(示例代码使用数据库权限作为示例)

http://www.vipan.com/htdocs/bitwisehelp.html

答案 3 :(得分:3)

我认为这种有点人为的情况并不是你想要回答的,所以我会假设在其他情况下有一些价值。

在具有功能构造的语言中,您可以从集合中“选择”与条件匹配的项目。

在Ruby中:

payment={cash=>true, credit=>true, check=>false}
methods_used=payment.select{ |key,value| value==true}.map { |key,value| key}

收益率[:现金,:贷方]

在C#3中:

var payment = new Dictionary<string, bool> 
   {{"cash", true}, {"credit",true}, {"check", false}};
var items=payment.Where(x => x.Value == true).Select(x => x.Key);
Console.WriteLine(String.Join(",",items.ToArray()));

在我能想到的大多数语言中,如果不将变量添加到集合或字典中,就不能直接从变量绑定中执行操作。可能存在某种异常,但我无法想到一个例外。

更近似的可能是Haskell,F#和OCaml等语言中的模式匹配,但我仍然无法找到让它看起来像你暗示的方式。

在Boo中,您可以更改编译器管道,以使用能够提供所需内容的内容替换if语句的语义。我可能会使用替代关键字,但您基本上可以提取所有子表达式,并将变量名称添加到块的范围,或者将“是”值添加到一个集合,将“nos”添加到另一个集合,并添加一个按惯例命名变量。为了有效地实现它,你可能不得不打破短路评估的惯例,这会使大多数人习惯于当代编程语言设计。

答案 4 :(得分:2)

我认为你的目标是什么(如果我错了,请纠正我,因为我不是100%肯定在这里)是这样的:

if (operandA || operandB || operandC || (operandD && operandE))
{
    //in here we have access to an environment-created array $TRUE_OPERANDS which stores the operands
    //that were TRUE in the most recently evaluated if-statement.
    //Maybe it contains the names of operands. suppose that A, C and E were TRUE
    //then $TRUE_OPERANDS = {'operandA', 'operandC', 'operandE'}
    //...but E was AND'd with D and D was false, so should E still be returned?
    //Are E and D considered separate operands or are the considered as a single "E && D" operand?
    //...and how would we implement nested if-statements?
    //Would there be only one global $TRUE_OPERANDS or would there be one
    //for the scope of every if-statement?
}

我不知道有任何语言可以做到这一点(至少不像我在这里说明的那样)。正如许多其他人所提到的,位掩码和枚举通常用于解决这个问题。其他一些人已经在Ruby,Python和C#中发布了可能接近你想要的例子。

答案 5 :(得分:2)

如果您的语言支持,您可以使用列表解析(例如Python):

list = [True, False, True, True]
print [x for x in list if x] # print only the True values

或者,位掩码通常用于此类任务(以及通常便宜且存在于大多数语言中):

CASH = 1
CREDIT = 2
ELSE = 4

myOption = CASH & ELSE

这完全取决于你究竟想要做什么。

答案 6 :(得分:1)

人类语言有时使用“或”一词来表示“独占或”,在许多语言(包括c,c ++和java)中用^表示。

也就是说,cash ^ credit评估为true,当且仅当cashcredit中的一个为真时。

答案 7 :(得分:1)

从评论中,您似乎在问:任何语言是否会自动为任何被评估的if语句创建该集合?

答案是否定的。至少,不是任何现代语言(C,C#,Java,Haskell,几乎任何东西)。原因是短路。想象一下if if语句:

if (a() || b() || c() || d()) {
}

也就是说,你调用一个函数来获取每个真值。如果a()的计算结果为true,那么任何现代语言都不会评估任何其他函数,因为它们不会更改整个语句的真值。现在的代码依赖于这种短路,因此更改语言以评估其所有或操作数可能会破坏大量代码。

对于在测试用例中有一组o和只有变量的特殊情况......这是一个非常特殊的情况,如果你想要一套什么,最好使用这里提出的一些其他解决方案是真实的,而不仅仅是否其中任何一个是真的。

答案 8 :(得分:0)