Интересный результат упражнения интервью: возвращение, пост инкремент и 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 ответа:
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 после выполнения операции+