Дано
static void Main(string[] args)
{
int n = 3;
int m = 8;
if (n < 0 & ++m > 0) ;
Console.WriteLine(m);
Console.ReadKey();
}
Почему значение переменной m меняется на 9. Ведь оно в условие должно передаваться по значению?
Дело в том, что оператор &, в отличие от оператора &&, не обладает 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 стоял вызов подпрограммы, вычисление фактических аргументов производится всё равно в контексте вызывающей функции, и изменения параметров видны. Не видны лишь изменения значений аргументов внутри вызываемой функции, т. к. туда уходят лишь копии параметров с типами-значениями.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей