Инкремент және декремент операторлары

Инкремент және декремент-   бірлікті қосатын немесе алып тастайтын біртұтас операторлар. Олар әдетте императивті бағдарламалау тілдерінде жүзеге асырылады.C-тәрізді тілдерде әр нұсқаның екі түрлі нұсқалары бар (алдыңғы және кейінгі) семантикасы сәл өзгеше.
Синтаксистік жолмен B тілінен алынған тілдерде (С және оның әр түрлі туындылары) өсу операторы `++`, ал азайту операторы `--` ретінде жазылады.  Кейбір басқа тілдер inc (x) және dec (x) функцияларын қолданады. Реттеу операторы ұлғаяды, ал кішірейту операторы оның операндының мәнін 1-ге төмендетеді. Операндта арифметикалық мәліметтер типі немесе сілтегіш типі болуы керек және өзгертілетін мәліметтер нысанына сілтеме болуы керек. Көрсеткіштердің мәні олардың жадында орналасқан келесі (немесе алдыңғы) элементті көрсететін сомаға артады (немесе азаяды).

Операторлардың екі нұсқасын қолдайтын тілдерде：
**Pre*-increment және *pre*-decrement операторлары өз операндасын 1-ге ұлғайтады (немесе азайтады) және өрнектің мәні нәтижелік ұлғайтылған (немесе азайтылған) мән болып табылады.
**Post*-increment және *post*-decrement операторлары өз операндының мәнін 1-ге арттырады (немесе азайтады), бірақ өрнек мәні операндының инкрементінің(немесе декрементінің) операциясына дейінгі бастапқы мәні болып табылады.
Инкремент/декремент өрнек болып табылмайтын тілдерде (мысалы,Go) бір ғана нұсқа талап етіледі (Go жағдайында-тек post операторлары қажет).

Қосатын/алатын оператор өзінің операндын өзгертетіндіктен, бұндай операндыны біреуден көп қолдану, әрі дәл сондай ретте қолдану белгісіз нәтижелерге әкеліп соғуы мүмкін. Мысалы, x - ++x сияқты өрнектерде азайту және көбейту операциялары қандай ретпен орындалуы тиіс екені түсініксіз. Мұндай өрнектер әдетте белгісіз мінез-құлық тудырады және оларды болдырмау керек.

## Мысалдар
Келесі код фрагменті алдын-ала және кейінгі өсіру мен азайту арасындағы айырмашылықты суреттейді:

```c
int x;
int y;
// Инкремент операторлары
// Pre increment- x мәні 1-ге көбейтіледі, содан кейін у-ге x мәні беріледі
x = 1;
y = ++x;    // x және y қазір 2-ге тең

// Post increment-y-ге x мәні, содан кейін x мәні 1-ге көбейтіледі
x = 1;
y = x++;    // x қазір 2-ге, ал y 1-ге тең

// Декремент операторлары
// Pre-decrement - x 1-ге азаяды, содан кейін y-ке x мәні беріледі
x = 1;
y = --x;    // x және y қазір 0-ге тең

// Post-decrement - y-ге x мәні беріледі, содан кейін x 1-ге азаяды
x = 1;
y = x--;    // х қазір 0-ге, у 1-ге тең
```


Осы операторлар жоқ тілдерде балама нәтижелер қосымша код жолын қажет етеді:

```python
# Pre-increment: y = ++x
x = 1
x = x + 1  # x 2-ге тең  (Pythonda «x + = 1» түрінде жазылуы мүмкін)
y = x      # y те 2-ге тең

# Post-increment: y = x++
x = 1
y = x      # y қазір 1-ге тең 
x = x + 1  # x қазір 2-ге тең
```


Post- increment оператор көбінесе массив көрсеткіштерімен қолданылады. Мысалы:

```c
// Массив элементтерінің қосындысы
float sum_elements(float arr[], int n)
{
    float  sum = 0.0;
    int    i =   0;

    while (i < n)
        sum += arr[i++];    // Массивтің n элементтерінен өтетін  i-нiң Post-incrementi
    return sum;
}
```

Post-increment операторы әдетте көрсеткіштермен қолданылады:

```c
//  Бір массивті екіншісіне көшіру
void copy_array(float *src, float *dst, int n)
{
    while (n-- > 0)        // N-нан нөлге дейін есептелетін цикл
        *dst++ = *src++;   // * (Src) элементін * (dst) -ге көшіру,
                           //  содан кейін көрсеткішті түзетеді
}
```


Бұл мысалдар сондай-ақ C++, Java және C# сияқты басқа да c-ұқсас тілдерде жұмыс істейтінін ескеріңіз.

*Инкремент операторы мысалда көрсетілуі мүмкін:
```c
#include <stdio.h>
int main()
{
  int c=2, d=2;
  printf("%d\n", c++); // сонда бұл оператор 2 көрсетеді, тек (c) айнымалы 3-ке дейін өсті.
  printf("%d", ++c);   // оның операторы 1-ден тұрақсыз шамаға (c) дейін өседі, содан кейін тек тұрақсыз шама (c)көрсетіледі
  return 0;
}
```

**Нәтиже:
```text
2
4
```


## Қолдау тілдері
Төмендегі тізім толық емес немесе толық болмаса да, бағдарламалаудың кейбір негізгі тілдерін тізімдейді: `++`/`--`  мәлімдемелері.

* ABAP
* AWK
* Bash
* C
* C++
* C#
* CFML

* D
* Go
* Java
* JavaScript
* Objective-C
* GNU Octave

* PARI/GP
* Perl
* PHP
* PowerShell
* Vala
* Vex, Houdini бағдарламалық қамтамасыз ету скриптік тілі
*Wolfram Language

(Apple's Swift осы операторларды бір рет қолдады, бірақ қолдау 3-нұсқадан алынды.)

Pascal, Delphi, Modula-2, және Oberon бірдей функцияларды қамтамасыз етеді, бірақ оларды inc (x) және dec (x) деп атайды.

## Тарих
Бұл тұжырымдаманы B бағдарламалау тіліне 1969 жылы Ken Thompson енгізген.

Томпсон көбейіп немесе азаятын (++ және--) операторларын ойлап тауып, одан әрі алға басты; олардың префиксі немесе постфикстің орналасуы операндтың мәнін көрсетерден бұрын немесе кейін өзгеріс болатындығын анықтайды. Олар В нұсқасының алғашқы нұсқаларында болмаған, бірақ жол бойында пайда болған. Адамдар көбінесе олар DEC PDP-11 ұсынған авто-өсіру және авто-декрессия режимдерін қолдану үшін жасалды деп ойлайды, мұнда C және Unix ең танымал болды.
Бұл тарихи мүмкін емес, өйткені әзірлеу кезінде PDP-11 болмаған. Алайда PDP-7 автокөлікпен бірнеше жад ұяшықтарына ие болды, олардың қасиеттері арқылы жадыны жанама сілтеме жасушаны ұлғайтты. Бұл мүмкіндік Томпсонға осындай операторларды шақырған болса керек; оларды префиксті де, постфиксті де жалпылау өз алдына болды. Шынында да, автоматты түрде өсіру ұяшықтары операторларды жүзеге асыруда тікелей қолданылмады және инновацияның мотивациясының күштілігі оның ++ x аудармасы x = x + 1 аудармасынан азырақ екендігі туралы пікірі болса керек.

## Тағы қараңыз
* Augmented assignment – for `+=` and `-=` operators
* PDP-7
* PDP-11
* Successor function

## Сілтемелер