Каково различие между операторами & и && в С#

Я пытаюсь понять разницу между и && операторов в С#. Я искал в Интернете без особого успеха. Может ли кто-нибудь объяснить пример?

Ответы

Ответ 1

& - побитовый оператор И. Для операндов целочисленных типов он будет вычислять побитовое И из операндов, и результат будет целочисленным. Для булевых операндов он будет вычислять логические и операнды. && является логическим оператором AND и не работает с целыми типами. Для булевых типов, где оба они могут быть применены, разница заключается в "коротком замыкании" свойства &&. Если первый операнд && оценивается как false, второй не оценивается вообще. Это не относится к &:

 bool f() {
    Console.WriteLine("f called");
    return false;
 }
 bool g() {
    Console.WriteLine("g called");
    return false;
 }
 static void Main() {
    bool result = f() && g(); // prints "f called"
    Console.WriteLine("------");
    result = f() & g(); // prints "f called" and "g called"
 }

|| аналогичен && в этом свойстве; он будет оценивать только второй операнд, если первый оценивает значение false.

Конечно, пользовательские типы могут перегружать этих операторов, заставляя их делать все, что им нужно.

Ответ 2

Настоятельно рекомендуем эту статью от Dotnet Mob: http://dotnetmob.com/csharp-article/short-circuit-evaluation-in-c/

- && является логическим оператором короткого замыкания

Для операций AND, если какой-либо из операндов оценивается как false, общее выражение вычисляется как false, поэтому нет необходимости оценивать остальные выражения аналогичным образом в операции OR, если любой из операндов, оцененных как true, а затем оставшаяся оценка может быть пропущена

- & оператор может использоваться как унарный, так и двоичный оператор. то есть унарный и может использоваться для получения адреса его операнда в небезопасном контексте.

Ответ 3

& является побитовым оператором и && & является логическим оператором, который применяется к операндам bool.

Ответ 4

Друг Хай, Оператор && (Логический оператор) используется в условных операторах. Для экземпляра

if(firstName == 'Tilsan' && lastName == 'Fighter')
{
      Response.Write("Welcome Tilsan The Fighter!");
}

Оператор Response.Write будет работать только в том случае, если обе переменные firstName и lastName соответствуют их условию.

В то время как для двоичных И-операций используется оператор и (Побитовый оператор), т.е. если мы пишем:

bool a, b, c;

a = true;
b = false;

c = a & b;

Response.Write(c); // 'False' will be written to the web page

Здесь первая операция Binary And будет выполняться для переменных a и b, а результирующее значение будет сохранено в переменной c.

Ответ 5

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

d=0;
n=10;

// this throws divide by 0 exception because it evaluates the 
//      mod even though "d != 0" is false
if ( (d != 0) & (n % d) == 0 ) 
   Console.Writeline( d + " is a factor of " + n);

// This will not evaluate the mod.
if ( (d != 0) && (n % d) == 0 ) 
   Console.Writeline( d + " is a factor of " + n);

Ответ 6

В соответствии с - С# 4.0 Полное обращение Герберта Шильдта

& - Логический И Оператор
| - Логический оператор ИЛИ

& & - Короткое замыкание и оператор
|| - Короткое замыкание или оператор

Простой пример может помочь понять явления

using System;

class SCops {
    static void Main() {
        int n, d;
        n = 10;
        d = 2;

        if(d != 0 && (n % d) == 0)
            Console.WriteLine(d + " is a factor of " + n);
        d = 0; // now, set d to zero

        // Since d is zero, the second operand is not evaluated.
        if(d != 0 && (n % d) == 0)
            Console.WriteLine(d + " is a factor of " + n);
        // Now, try the same thing without the short-circuit operator.
        // This will cause a divide-by-zero error.
        if(d != 0 & (n % d) == 0)
            Console.WriteLine(d + " is a factor of " + n);
    }
}

Здесь оператор и проверяет каждый операнд и && проверяет только первый операнд.

Как вы могли заметить, для операций "И" любой операнд, который является ложным, будет оценивать все выражение в false независимо от любого другого значения операндов в выражении. Эта короткая замкнутая форма помогает оценить первую часть и достаточно умна, чтобы знать, нужна ли вторая часть.

Запуск программы приведет к ошибке divide-by-zero для последнего условия if, где проверяются оба операнда и оператор, и обработка исключений не выполняется для устранения того факта, что 'd' может быть 0 в любой точке время.

Тот же случай относится к '|' в С#.

Это немного отличается от C или С++, где '&' и '|' были побитовыми операторами И и ИЛИ. Однако С# также применяет побитовый характер and и | только для переменных int.