c # Оператор присваивания & = - PullRequest
5 голосов
/ 04 апреля 2011

, если у меня есть следующее bool:

bool success = true;

Будут ли следующие три строки кода сохранять одинаковые результаты в случае успеха:

1 - success &= SomeFunctionReturningABool();

2 - success = success & SomeFunctionReturningABool();

3 - success = success && SomeFunctionReturningABool();

Я нашел статью, в которой говорится, что 1ярлык для 2 - но 2 - это то же самое, что и 3, или мое приложение будет взорвано при выполнении этой строки ...

Ответы [ 4 ]

8 голосов
/ 04 апреля 2011

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

Источник: http://msdn.microsoft.com/en-us/library/2a723cdk(v=vs.80).aspx

Что касается оператора присваивания &=, он работает так же, как одиночный &.

2 голосов
/ 04 апреля 2011

1 и 2 одинаковы так же, как следующие:

int value += 1;
int value = value + 1;

3 не то же самое, как если бы success было ложным, SomeFunctionReturningABool() не будет вызвано - это не то, что вы хотите.

0 голосов
/ 04 апреля 2011

Вы правы. 1 является ярлыком для 2. Разницу между '&' и '&&' вы можете найти здесь msdn

'&' является логическим И, в то время как '&&' является условным И

0 голосов
/ 04 апреля 2011

Параметры 2 и 3 эквивалентны, и &= делает именно это.

Вы должны знать, что в случае сбоя первого вызова последующие вызовы могут не произойти: например,

if (x != null && x.Test() == true)

Сначала оценивается x != null, а если оно ложно, вторая часть не будет выполнена.То же самое может применяться и здесь.

(Ха, интересно, это только для &&, а не & ...)

...