Есть ли время, когда && (AndAlso) не имеет значения по & & (А) - PullRequest
8 голосов
/ 13 ноября 2008

Если я оцениваю две переменные, а не два вызова метода, имеет ли значение погода, я использую "&&" или "&"

//some logic that sets bool values

boolean X = true;
boolean Y = true;

if (X & Y){
   // perform some operation
}

if (X && Y){
   // perform some operation
}

Кроме того, книга, которую я использую для C # 3.0 / .NET 3.5, содержит ссылку только на оператор &&, оператор & уходит?

Ответы [ 4 ]

9 голосов
/ 13 ноября 2008

Всегда используйте &&, если вы выполняете проверку на истинность / ложь. Сингл & выполняет побитовое 'и'. В некоторых случаях он работает как логический тест, но он не гарантирован для всех логических случаев. Чаще всего используется одиночный символ & при применении битовой маски.

Примеры (&&):

true && true == true

Пример (&):

00101001 & 00100001 = 00100001
7 голосов
/ 13 ноября 2008

Если вы используете один & (А), то вычисляется вторая часть выражения. Это может быть плохо, если вторая часть полагается на правду первой части. Обычно всегда используйте &&, поскольку вторая часть не оценивается, если первая часть имеет значение false.

Логично, что single & выполняет побитовую операцию, как говорили другие, которая все еще действительна для логического сравнения / оценки. Действительно, единственный раз, когда должен использоваться одиночный символ & (или |) (или логическая оценка), - это когда всегда выполняется вторая оценка (если это вызов функции / модификатор). Это плохая практика и, вероятно, почему в книге об этом не говорится.

Одиночные и полезны с флагами и битовыми масками.

Следующее исключение obj будет пустым:

bool b = obj != null & obj.IsActive

Но это будет работать:

bool b = obj != null && obj.IsActive

Это плохо:

bool b = obj.IsActive && obj.SetActive(false);
bool b = obj.IsActive & obj.SetActive(false);

Оператор & здесь, чтобы остаться.

3 голосов
/ 13 ноября 2008

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

Однако есть много задач, которые лучше всего решить с такими, в частности, все, что смотрит на данные как флаги. Оператор & необходим на 100% и никуда не денется - он просто не используется так часто, как логический оператор короткого замыкания &&.

Например:

[Flags]
enum SomeEnum { // formatted for space...
    None = 0, Foo = 1, Bar = 2 // 4, 8, 16, 32, ...
}
static void Main() {
    SomeEnum value = GetFlags();
    bool hasFoo = (value & SomeEnum.Foo) != 0;
}
static SomeEnum GetFlags() { ... }
1 голос
/ 13 ноября 2008

& - побитовый оператор, а && - оператор AND. Две совершенно разные операции.

int a = 1;
int b = 2;
assert (a & b == 0) 
assert (a && b == true) 

РЕДАКТИРОВАТЬ: Упс ... этот пример не работает в C #. Это должно быть в C ++. Надеемся, что это иллюстрирует намерение и разницу между двумя операторами.

...