@wf1138

Почему логическое «И» & в C# возвращает 1?

static void Main(string[] args)
        {
            int firstNumber = 0;
            bool simpleLogicResult = true & false & (firstNumber++ > 0); 
            Console.WriteLine($"firstNumber = {firstNumber}");

            int secondNumber = 0;
            bool shortCircuitResult = true && false && (secondNumber++ > 0); 
            Console.WriteLine($"secondNumber = {secondNumber}");

            // Delay
            Console.ReadKey();


Сверху пример кода.

Первый случай возвращает 1.
Второй 0.

Ей богу, ума не приложу, почему в 1 случае выходит именно 1. По идее же, должен быть 0, так как false присутствует УЖЕ на этапе сравнения.

И получается, что 1*0*0 должно выйти 0.

А выходит 1...
  • Вопрос задан
  • 136 просмотров
Решения вопроса 2
vabka
@vabka Куратор тега C#
Токсичный шарпист
0 возвращает не &.

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

Получается, что в первом случае выражение вычисляется полностью:
true & false & false -> false
Выражение firstNumber++ > 0 имеет значение false, тк это пост-инкремент.
В результате значение firstNumber=1 тк инкремент был вызван.

Во втором случае инкремент не будет вызван, тк значение выражение будет очевидно в самом начале:
(true && false)&& ... -> false
Тк инкремент не вызван, secondNumber=0
Ответ написан
Комментировать
@Iv_and_S
"&" - это синтаксис - "полные вычисления".
вычисляются ВСЕ операнды. а значит firstNumber++ отработает.

"&&" - это синтаксис - "сокращенные вычисления".
до оперенда , secondNumber++ вычисление просто не дойдет, т.к. в этом нет смысла. оно уже false.

p.s. вместо "ума не приложу"- внимательно, в любой книге, раздел "условные выражения".
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы