使用'&'与'&&'

时间:2011-04-04 11:09:01

标签: c#

我遇到了这个:

bool Isvalid = isValid & CheckSomething()

bool Isvalid = isValid && CheckSomething()

第二种情况可能是短路的情况。

所以我们不能只使用&代替&&吗?

5 个答案:

答案 0 :(得分:61)

&安培;是一个有点“AND”,意味着它在位级上工作。 &安培;&安培;是逻辑“AND”意味着它在布尔(true / false)级别工作。逻辑AND使用短路(如果第一部分是假的,则无法检查第二部分)以防止运行多余的代码,而逐位AND需要和每一位,以便它将获得值。

你应该使用逻辑AND(&&),因为这就是你想要的东西(并且可能没有做正确的事情),但如果你想评估它的副作用,你可能需要单独运行该方法: / p>

var check = CheckSomething();
bool IsValid = isValid && check;

答案 1 :(得分:12)

In&&第二个表达式仅在第一个表达式为真时进行评估。

和&只是一种连接两个表达式的方法,比如true& true = true,true& false = false等。

答案 2 :(得分:6)

我相信你错过了一些东西。在第二个场景中,如果isValid为false,则不评估CheckSomething

条件AND运算符(&&)执行其bool操作数的逻辑AND,但只在必要时才计算其第二个操作数。

http://msdn.microsoft.com/en-us/library/2a723cdk(v=vs.71).aspx

答案 3 :(得分:6)

C#有两种类型的布尔逻辑运算符:

  1. x & y Logical AND

    • true仅在xy评估为true
    • 时才会生成结果
    • 评估 xy
  2. x && y Conditional Logical AND

    • true仅在xy评估为true
    • 时才会生成结果
    • 首先评估x,如果x评估为false,则会立即返回false而不评估y短路
  3. 因此,如果您依赖于被评估的xy,您可以使用&运算符,尽管它很少使用且难以阅读,因为副作用并非总是如此向读者清楚。

    注意:integer types的二进制&运算符也存在,它执行按位逻辑AND。

答案 4 :(得分:-3)

我到目前为止拥有的最佳用途

void BooleanTestV1 (){
    int num = 0;
    bool IsOne = false;

    for (int i = 0; i< 100; i++){
        num = i;
        if (IsOne == false) {
            IsOne = num == 1;
        }
    }

    if (IsOne) {
        // Yeay it works!
    }
}

void BooleanTestV2 (){
    int num = 0;
    bool IsOne = false;

    for (int i = 0; i< 100; i++){
        num = i;
        if (IsOne == false && (IsOne = num == 1)) {
            // Do Somehing...
        }
    }

    if (IsOne) {
        // Yeay it works!
    }
}

void WhyUseOneAND() {
    int num = 0;
    bool IsOne = false;

    for (int i = 0; i < 100; i++) {
        num = i;
        if (num < 0 & (IsOne == false && (IsOne = num == 1))) {
            // If we are using && 
            // isOne will never checking (num == 1)
            // Because && will stop running after found a false (num < 0)
            // Good for caching (here "IsOne" is the variable we cached)

            // Note: anything here will not be executed, cuz num < 0 will never be true
        }
    }

    if (IsOne) {
        // Yeay it works!
    }
}