#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 стоял вызов подпрограммы, вычисление фактических аргументов производится всё равно в контексте вызывающей функции, и изменения параметров видны. Не видны лишь изменения значений аргументов внутри вызываемой функции, т. к. туда уходят лишь копии параметров с типами-значениями.
Комментариев нет:
Отправить комментарий