Дано
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
стоял вызов подпрограммы, вычисление фактических аргументов производится всё равно в контексте вызывающей функции, и изменения параметров видны. Не видны лишь изменения значений аргументов внутри вызываемой функции, т. к. туда уходят лишь копии параметров с типами-значениями.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Я наткнулся на метод PushFrame у класса DispatcherБегло посмотрел реализацию и прочитал про него в документации
Код почему-то виснет и только через секунд 10 строит уже отсортированный график, то бишь промежуточных построений не видноИз-за чего это может...