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

Програмски језик C располаже унарним оператором инкрементирања (енгл. increment operator) ++ којим се вредност операнда повећава за \(1\) и унарним оператором декрементирања (енгл. decrement operator) -- којим се вредност операнда смањује за \(1\). Ове операторе можеш користити на два начина и то у:

  • префиксном облику (нпр. ++x или --x) и

  • постфиксном облику (x++ и x–).

У префиксном облику, операнд оператора ++, односно, операнд оператора -- ће се инкрементирати, односно декрементирати, пре него што се користи у изразу. У постфиксном облику, операнд оператора ++, односно, операнд оператора -- ће се прво користити у изразу, па тек након тога инкрементирати, односно декрементирати.

Оператори инкрементирања и декрементирања у постфиксном облику имају приоритет 1 и леву асоцијативност. Након њих следе и оператори инкрементирања и декрементирања у префиксном облику са приоритетом 2, који имају десну асоцијативност.

Веома је важно да уочиш разлику у редоследу извршавања операција над операндима када користиш операторе инкрементирања и декрементирања у префиксном, односно постфиксном облику, јер ће вредност израза зависити од облика у којем су написани.

Напиши програм у програмском језику C који ће на стандардном излазу редом исписати оцене које су Алиса и Боб добили на другом тесту из математике, ако је целобројна променљива a = 3 иницијализована са оценом коју је Алиса добила на првом тесту из математике, а целобројна променљива b само декларисана, јер је Боб био одсутан и није радио први тест. На другом тесту, Боб и Алиса добили су оцену више од оцене коју је Алиса добила на првом тесту.

#include <stdio.h>

int main(void)
{
    int a = 3, b;
    b = ++a;
    printf("%d %d", a, b);
    return 0;
}

На стандардном излазу исписаће се

4 4

Прво је променљива a инкрементирана, па је променљивој b додељена нова инкрементирана вредност променљиве a.

Значи, може се рећи да је наредба…

b = ++a;

…еквивалентна наредбама…

a = a + 1;
b = a;

…односно наредбама:

a += 1;
b = a;

Исто важи и за оператор декрементирања.

Напиши програм у програмском језику C који ће на стандардном излазу редом исписати оцене које су Алиса и Боб добили на другом тесту из програмирања, ако је целобројна променљива a = 4 иницијализована са оценом коју је Алиса добила на првом тесту из програмирања а целобројна променљива b само декларисана, јер је Боб био одсутан и није радио први тест. На другом тесту, Боб је добио оцену коју је Алиса добила на првом тесту, док је Алиса добила оцену више него на првом тесту.

#include <stdio.h>

int main(void)
{
    int a = 4, b;
    b = a++;
    printf("%d %d", a, b);
    return 0;
}

На стандардном излазу исписаће се

5 4

Прво је променљивој b додељена вредност променљиве a, па је тек након тога променљива a инкрементирана.

Може се рећи да је наредба…

b = a++;

…еквивалентна наредбама…

b = a;
a = a + 1;

…односно наредбама:

b = a;
a += 1;

Исто важи и за оператор декрементирања.

Оператор инкрементирања или оператор декрементирања често ћеш користити као једини оператор у наредби, када требаш да повећаш или умањиш вредност операнда за \(1\).

Напиши програм у програмском језику C који ће на стандардном излазу редом исписати оцене које су Алиса и Боб добили на другом тесту из хемије, ако су целобројне променљиве a = 3 и b = 3 иницијализоване са оценама које су Алиса и Боб добили на првом тесту из хемије. На другом тесту, Алиса је добила оцену више него на првом тесту, а Боб оцену мање него на првом тесту.

#include <stdio.h>

int main(void)
{
    int a = 3, b = 3;
    ++a;
    --b;
    printf("%d %d", a, b);
    return 0;
}

На стандардном излазу исписаће се инкрементирана оцена коју је Алиса добила на првом тесту и декрементирана оцена коју је Боб добио на првом тесту:

4 2

У овом случају постфиксни и префиксни облици оператора инкрементирања и декрементирања неће утицати на коначан резултат, па ће и програм:

#include <stdio.h>

int main(void)
{
    int a = 3, b = 3;
    a++;
    b--;
    printf("%d %d", a, b);
    return 0;
}

исписати на стандардном излазу исте вредности:

4 2

У стандарду програмског језика C није изричито прописано када се инкрементирање или декрементирање дешава ако се оператори инкрементирања или декрементирања употребљавају над истом променљивом у истом изразу - да ли пре или после употребе оператора, или пре или после целог израза, или негде током извршавања израза. Због тога, употреба оператора за инкрементирање или декрементирање над истом променљивом у истом изразу резултује непредвидивим понашањем. Исти изворни код произвешће различите резултате када се компајлира различитим компајлерима, или истим компајлером са различитим оптимизационим подешавањима.

Због тога, избегавај да користиш операторе инкрементирања или декрементирања над истом променљивом у истој наредби, као на пример: int x = 1; x = x++ + ++x;