Какой результат работы будет у следующей программы и почему:
class Program { static void Main(string[] args) { int x; Increment(ref x); Console.WriteLine(x); Console.ReadKey(); } static void Increment(ref int x) { x++; } }
Приведенная выше программа не скомпилируется, так как перед передачей переменной x типа int в качестве ref-аргумента ей должно быть присвоено начальное значение.
Какое число (или какие числа) выведет на консоль следующая программа и почему:
class Program { static void Main(string[] args) { int i = 0; Console.Write(i++ + Calculate(i)); Console.WriteLine(i); Console.ReadKey(); } public static int Calculate(int i) { Console.Write(i++); return i; } }
На консоль будет выведено число 121.
Вначале выполняется инкремент переменной i (i++
).
Затем ее увеличенное значение (то есть число 1) передается в метод Calculate()
.
Выполняется вызов метода Calculate(). В этом методе в вызове Console.Write(i++) переданное через параметр значение увеличивается на единицу, но так как это постфиксный инкремент, то возвращается число 1 и это же число выводится на консоль.
Далее метод Calculate возвращает число 2.
Выполнение возвращается к строке Console.Write(i++ + Calculate(i));
. Итак, здесь выражение Calculate(i)
возвращает 2. Но выражение i++
, хотя и увеличивает значение переменной i на единицу, возвращает ее значение до увеличения, то есть число 0,
так как это постфиксный инкремент. Поэтому на консоль будет выведено число 0 + 2 = 2.
Так как ранее уже было выведено число 1, то после выполнение этого кода на консоли фактически будет число 12.
В конце выполняется строка Console.WriteLine(i)
, которая добавляет к выведенному числу значение переменной i, то есть 1.
Таким образом, на консоль будет выведено число 121.