Появившиеся в языке С и перенесенные в C++ и Java операторы инк
1
-ремента и декремента позволяют лаконично выразить, что вы хотите увеличить или уменьшить числовое значение на 1. То есть /++ равносильно добавлению 1 к текущему значению /'.
Наличие двух форм операторов инкремента и декремента иногда приводит к путанице.
Префиксный
и
постфиксный
типы этих операторов отличаются тем, в какой момент производится изменение значения. В префиксной версии операторов инкремента и декремента
(++аи — а
соответственно) сначала выполняется операция, а затем создается значение. В постфиксной версии
(а++
using System;
class IncDecApp {
public static void Foo(int j)
{
Console.WriteLine("IncDecApp.Foo j = {0}", j);
>
public static void Main() {
int i = 1;
Console.WriteLineC'flo обращения к Foo(i++) = {0}", i);
Foo(i++);
Console.WriteLine("После обращения к Foo(i++) = {0}", i);
Console.WriteLine("\n");
\ Console.WriteLineC'flo обращения к Foo(++i) = {0}", i);
\ Foo(++l);
\ Console.WrlteLine("После обращения к Foo(++i) = {0}", i);
l Результат выполнения будет таким:
До обращения к Foo(i++) = 1
IncDecApp.Foo j = 1
После обращения к Foo(i++) = 2
До обращения к Foo(-n-i) = 2
IncDecApp.Foo j = 3
После обращения к Foo(++i) = 3
Разница в том,
когда
создается значение и модифицируется операнд. При вызове
Foo(i++)
значение /' передается (без изменений) в метод
Foo
и
после
возврата из метода / увеличивается на 1. Посмотрите на приведенный MSIL-код: команда
add
выполняется после помещения значения в стек.
IL.0013: ldloc.0
IL.0014: dup
IL_0015: Idc.i4.1
IL_0016: add
IL_0017: stloc.O
IL_0018: call void IncDecApp::Foo(int32)
Теперь посмотрим на префиксную форму оператора, используемую в вызове
Foo(++a).
В этом случае MSIL-код будет другой. При этом команда
add
выполняется
до
того, как значение помещается в стек для последующего вызова метода
Foo.
IL.0049: ldloc.0
IL_004a: Idc.i4.1
IL_004b: add
IL_004c: dup
IL_004d: stloc.O
IL_004e: call void IncDecApp::Foo(int32)