Интересный результат упражнений для интервью: возврат, пост-приращение и поведение рефлекса
Вот простой код приложения консоли, который возвращает результат, который я не понимаю полностью.
Попробуйте подумать, выводит ли он 0, 1 или 2 в консоли:
using System;
namespace ConsoleApplication
{
class Program
{
static void Main()
{
int i = 0;
i += Increment(ref i);
Console.WriteLine(i);
Console.ReadLine();
}
static private int Increment(ref int i)
{
return i++;
}
}
}
Ответ равен 0.
Я не понимаю, почему post increment i++
, из метода Increment
, который выполняется на ref
(а не на копии переданной переменной), увеличивает значение переменной, но это просто позже игнорируется.
Что я имею в виду в этом видео:
![]()
Может кто-нибудь объяснить этот пример и почему во время отладки я вижу, что это значение увеличивается до 1, но затем оно возвращается к 0?
Ответы
Ответ 1
i += Increment(ref i);
эквивалентно
i = i + Increment(ref i);
Выражение в правой части присваивания вычисляется слева направо, поэтому следующий шаг
i = 0 + Increment(ref i);
return i++
возвращает текущее значение i
(которое равно 0), затем увеличивает i
i = 0 + 0;
Перед назначением значение i
равно 1 (увеличивается в методе Increment
), но присваивание снова делает его 0.
Ответ 2
Я думаю, что "волшебство" здесь - это просто приоритет операции порядок операций
i += Increment(ref i)
совпадает с
i = i + Increment(ref i)
операция + выполняется слева направо
так что сначала мы принимаем i... в то время как 0...
то мы добавим результат Increment (ref i)... который также равен 0... 0 + 0 = 0... но подождите... прежде чем мы получим этот результат, я фактически увеличивается...
что приращение происходит после того, как левый операнд нашей + операции оценивается b... поэтому он ничего не меняет... 0 + 0 все еще равен 0... таким образом, я присваивается 0 после того, как операция + выполнен
Ответ 3
Как вы упомянули - постинкремент "i ++". statement - "return я ++;" будет устанавливать значение "i" в памяти после того, как будет возвращено исходное значение.
попробуйте использовать "return ++ i;" и, вероятно, вы его получите.