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

320
22 января 2017, 13:36

Дано

static void Main(string[] args)
{
    int n = 3; 
    int m = 8;
    if (n < 0 & ++m > 0) ; 
    Console.WriteLine(m);
    Console.ReadKey();
}

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

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

READ ALSO
Делегаты и события C#

Делегаты и события C#

Доброго дня!

358
Для каких целей нужен метод PushFrame

Для каких целей нужен метод PushFrame

Я наткнулся на метод PushFrame у класса DispatcherБегло посмотрел реализацию и прочитал про него в документации

346
Визуализация сортировки выбором

Визуализация сортировки выбором

Код почему-то виснет и только через секунд 10 строит уже отсортированный график, то бишь промежуточных построений не видноИз-за чего это может...

441