Интересный результат упражнения интервью: возвращение, пост инкремент и ref поведение [дубликат]


этот вопрос уже есть ответ здесь:

  • Пост-инкремент в пределах самоназначения 6 ответов

вот простой код консольного приложения, который возвращает результат, который я не совсем понимаю.

попробуйте подумать, выводит ли он 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.

то, что я не понимаю, почему пост инкремент i++ С Increment метод, который выполняется на ref (не на копии переданной переменной) увеличивает переменную, но она просто игнорируется позже.

что я имею в виду в этом видео:

может кто-нибудь объяснить этот пример и почему во время отладки я вижу, что значение увеличивается до 1, но затем оно возвращается к 0?

3 59

3 ответа:

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.

Я думаю, что "магия" это просто приоритеты порядок действий

i += Increment(ref i)

это то же самое, что

i = i + Increment(ref i)

операция + выполняется слева направо

Итак, сначала мы возьмем i ... который в это время равен 0 ...

затем мы добавляем результат инкремента (ref i) ... что тоже 0 ... 0+0=0 ... но подождите ... прежде чем мы получим этот результат, я фактически увеличен ...

это приращение происходит после левый операнд нашей операции + был оценен Беном ... так что это ничего не меняет ... 0+0 все равно будет 0 ... таким образом, i присваивается 0 после выполнения операции+

Как вы упомянули-постинкремент " i++". оператор - "return i++;" установит значение ' i ' в памяти после возврата исходного значения.

попробуйте использовать "return ++i;" и, вероятно, вы получите его.