Принципы объектно-ориентированного программирования

         

Операторы инкремента и декремента



Операторы инкремента и декремента

Появившиеся в языке С и перенесенные в 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)



Содержание раздела