Предыдущие ответы верны, но не адресуйте, как & отличается от & &, который, как я думал, был вашим первоначальным вопросом, поэтому я возьму это.
Как было сказано, «&» побитовое И. "& &" является логическим И.& выполняет операцию И по своим операндам побитно, и в целом выполняет функции точно как плюс или время или любой арифметический оператор. & & сложнее. Если сравнивается каждый из его операндов с нулем. Если первый операнд равен нулю, он принимает значение FALSE и замыкает оставшуюся часть выражения, т. Е. Не оценивает оставшиеся операнды. Если первое значение отличное от нуля, оно проверяет второе значение. Если это значение равно нулю, оно принимает значение false, иначе оно принимает значение true. В любом случае он продолжает оценивать выражение.
То есть, есть два важных различия между & и & &:
& работает по кусочкам, а & & рассматривает только ноль и отличны от нуля и всегда возвращает либо 0, либо 1. Таким образом, 5 & 6 (двоичный код 101 & 110) дает 4 (двоичный код 100), а 5 & & 6 дает 1 (true).
& & "короткое замыкание". Если первое значение равно нулю, оно не оценивает второе значение. & не имеет такого правила. Это важно несколькими способами. Во-первых, если второе значение имеет какие-либо побочные эффекты, то с & эти побочные эффекты всегда случаются, а с & & они этого не делают. Итак, «x & (y ++)» всегда будет увеличивать y, а «x & & (y ++)» будет увеличивать y только тогда, когда x не равен нулю. Это становится более важным и, возможно, более тонким, если второй операнд является вызовом функции. Во-вторых, первое значение может проверить что-то, что определяет, что второе значение недействительно. Как "x! = NULL & & x-> foo == 3". С &, когда x имеет значение null, которое может бомбить с ошибками сегмента или эквивалентом. И, в-третьих, могут быть важные улучшения производительности. Life, "x! = 'A' & & readTonsOfStuffFromDatabaseAndCalculateTotal (x)". С & чтение будет происходить независимо и, возможно, будет пустой тратой времени.
Именно поэтому мы почти всегда используем & & для вещей, которые на самом деле являются логическими операциями, и ограничение использование &, когда мы действительно хотим побитовую операцию. Но бывают случаи, когда вы НЕ хотите, чтобы короткое замыкание произошло, и в этом случае & может быть хорошим выбором. Но если вы используете его для работы «логически», будьте очень осторожны с операндами, которые могут иметь любые значения, отличные от 0 или 1. 1 & & 2 истинно, но 1 & 2 неверно.
Если вы думаете об этом заявлении ... Это неэффективно. – Min
Я получил это от этого вопроса http://stackoverflow.com/questions/1537528/how-to-convert-system-linq-enumerable-wherelistiteratorint-to-listint/1537568#1537568, в котором было указано, что & -образный вариант Быстрее. –