Подтвердить что ты не робот

Использование '&' против '&&'

Я сталкивался с этим:

bool Isvalid = isValid & CheckSomething()

bool Isvalid = isValid && CheckSomething()

Второй случай может быть сценарий короткого замыкания.

Так не можем ли мы всегда использовать только & вместо &&?

4b9b3361

Ответ 1

& бит "И", что означает, что он работает на уровне бит. && является логическим "И", что означает, что он работает на логическом (истинном/ложном) уровне. Логическое И использует короткое замыкание (если первая часть ложна, нет необходимости проверять вторую часть), чтобы предотвратить запуск избыточного кода в то время как бит-мудрый И должен и каждый бит, чтобы он получил значение.

Вы должны использовать логический И (& &), потому что то, что вы хотите (& может поистине не делать правильно), но вам может потребоваться запустить метод отдельно, если вы хотите оценить его побочные эффекты:/p >

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

Ответ 2

В && второе выражение оценивается только в том случае, если первое верно.

И это всего лишь способ объединить два выражения, такие как true и true = true, true и false = false и т.д.

Ответ 3

В С# есть два типа логических операторов для логических значений:

  1. x & y Логическое И

    • Результаты в true, только если x и y оценивают как true
    • Оценивает как x, так и y.
  2. x && y Условное логическое И

    • Результаты в true, только если x и y оценивают как true
    • Сначала выполняется оценка x, и если x оценивается как false, он немедленно возвращает false без оценки y (короткое замыкание)

Поэтому, если вы полагаетесь как на оценку x, так и на y, вы можете использовать оператор &, хотя он редко используется и его труднее читать, поскольку побочный эффект не всегда понятен читателю.

Примечание. Бинарный оператор & также существует для целочисленных типов, где он выполняет побитовое логическое И.

Ответ 4

Я считаю, что вам что-то не хватает. Во втором сценарии CheckSomething не оценивается, если isValid - false

Оператор условного-AND (& &) выполняет логическое-AND своих операндов bool, но при необходимости оценивает его второй операнд.

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

Ответ 5

Лучшее использование у меня до сих пор

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!
    }
}