Страницы

Поиск по вопросам

вторник, 28 января 2020 г.

Почему изменяется значение переменной?

#c_sharp


Дано

static void Main(string[] args)
{
    int n = 3; 
    int m = 8;

    if (n < 0 & ++m > 0) ; 
    Console.WriteLine(m);
    Console.ReadKey();
}


Почему значение переменной m меняется на 9. Ведь оно в условие должно передаваться
по значению?
    


Ответы

Ответ 1



Дело в том, что оператор &, в отличие от оператора &&, не обладает short-circuiting-логикой. То есть он всегда вычисляет оба операнда. Если бы вы написали if (n < 0 && ++m > 0) — второй операнд бы не вычислялся, т. к. значение первого уже определяет значение результата. Но с & у вас вычисляется и правая, и левая части, и переменная m увеличивается. Проверка: код int n = 3; int m = 8; var b1 = n < 0 && ++m > 0; Console.WriteLine(m); // выводит 8 var b2 = n < 0 & ++m > 0; Console.WriteLine(m); // выводит 9 Цитата из документации: Оператор & вычисляет оба операнда независимо от значения первого из них. Дополнение: поскольку if (...) не является вызовом подпрограммы, то он работает не с копией, а с оригиналом value type. Поэтому за блоком if изменения внутри блока всё ещё видны. С другой стороны, даже если бы вместо if стоял вызов подпрограммы, вычисление фактических аргументов производится всё равно в контексте вызывающей функции, и изменения параметров видны. Не видны лишь изменения значений аргументов внутри вызываемой функции, т. к. туда уходят лишь копии параметров с типами-значениями.

Комментариев нет:

Отправить комментарий