繁体   English   中英

使用 (或)C#中的运算符

[英]Use of | (or) operator in C#

我想知道这两种方法是否等效? 其中一个比另一个更好吗?

第一:

bool x = foo();
bool y = bar();

if(x || y)
{
   //...
}

第二:

if(foo() | bar())
{
   //...
}

http://msdn.microsoft.com/zh-CN/library/6373h346(v=vs.71).aspx

条件OR运算符(||)对它的布尔操作数执行逻辑或,但仅在必要时才对其第二个操作数求值。

http://msdn.microsoft.com/zh-CN/library/kxszd0kx(v=vs.71).aspx

二进制| 预定义了整数类型和布尔运算符。 对于整数类型,| 计算其操作数的按位或。 对于布尔操作数,| 计算其操作数的逻辑或; 也就是说,当且仅当两个操作数都为假时,结果才为假。

这两个版本是等效的。 || 操作员短路,但| 才不是。 由于您在测试x || y之前先评估xy x || y ,与foo() | bar()相同foo() | bar() foo() | bar()

现在,如果您已经比较

foo() | bar()

foo() || bar()

那么他们会有所不同。 但是,您先前对xy求值足以使两个测试等效。

之间的主要区别| || 是短路的,但是在这里没关系,因为您的代码使用|| 已经预先评估了两个表达式,此处的短路无关紧要。

假设foo()bar()返回一个正常的布尔值,这应该是等效的。

如果返回类型不同于bool型,则隐式转换和重载解析可能导致不同的结果。

如果您使用基本值不同于01被盗布尔值(仅使用不安全代码可以实现AFAIK),它们也可以不同。

使用被盗用的bool,我们可以观察到| 具有二进制语义,即使是布尔语言也是如此。 我不确定这是在运行时级别指定的行为,还是只是未定义的行为,因此可能会因不同的编译器/抖动版本而改变。 我使用显式结构布局的实现当然是未定义的行为,但是我不确定其他语言是否可以在没有此类黑客的情况下创建此类布尔变量。

void Main()
{
    bool b1 = hackbool(1);
    bool b2 = hackbool(2);
    ((b1 | b2)&b2).Dump();
    ((b1 || b2)&b2).Dump();
}

[StructLayout(LayoutKind.Explicit)]
internal struct Evil
{
    [FieldOffset(0)]public int i;
    [FieldOffset(0)]public bool b;
}

bool hackbool(int i)
{
    Evil e=new Evil();
    e.i=i;
    return e.b;
}
if(foo() | bar())
{
   //...
}

如果您的意思是foo() || bar() foo() || bar() ,在某些情况下,这将比第一个版本快。 foo()为true时,它将不执行bar()但在|的情况下,它等效

|| 是条件OR(测试布尔值),并且| 是按位或。

| 是一个节肢手术操作员。 因此(二进制)0101 | 0111 = 0111(您将其中一个操作数的值为1.放置为1。

|| 是逻辑运算符,如果a或b为true,则如果发生(a || b){做某事}。

他们是完全不同的。

|| 也是一个“序列点”。 例如,如果您编码

if (foo() || bar())
    ....

如果foo()返回true,甚至可能不会调用bar(),因为'if'具有将表达式表示为true所需的全部条件。 那可能好,也可能不好!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM