Другие языки программирования и технологии

Инкремент и декремент

Никак не могу разобраться, как они работают? То есть, допустим, есть выражение - если два плюса стоят справа, то сразу прибавляем единицу, а только потом считаем выражение. Если два плюса стоя позади, то сначала считаем выражение, но только потом к ответу выражения прибавляем единицу, так? Если можно поясните на этом примере: z = a%2 - (x+b)/c + (x-y)/(a-1) + 1/4*a - y++ +++b/3.
Так все, но от этого язык си и запутанней.
Я потому стараюсь не применять в сложных выражениях.
Проще и понятней написать:
b++;
z = a%2 - (x+b)/c + (x-y)/(a-1) + 1/4*a - y +b/3;
y++;
(С ) )))))))
(С ) )))))))
80 276
Лучший ответ
Не надо так делать.
Результат этой операции зависит от языка программирования (который вы не указали) и даже компилятора - потому что неизвестно, справа налево или слева направо будут вычисляться суммы, а из-за этого ++b может повлиять на значение b в (x+b)/c. Используете в выражении инкримент - используйте инкриментируемую переменную один раз.
Никита 12333
Никита 12333
62 825
Нет, Вы неправильно понимаете.

Инкремент и декремент придуманы чтобы удобнее индексировать массив, не добавляя дополнительных операторов.
Вы только усвоили процесс как меняется индекс.
Но индекс это только вспомогательный элемент,
Основная работа идёт с массивом и переменными.
Чтобы их изменить применяется присвоение со знаком =.
Значит левое и правое выражения присутствуют.

В операциях n++; и ++n; нет ничего кроме индекса и поэтому результат одинаковый.

Результатом работы с массивом и переменными является результат присвоения значения им, а не индексу. Но индекс может на них влиять, даже незаметно.
int m(10);
m(0)=4; m(1)=7;
n=1;

c=m(i++);
d=m(i);
e= ++n;
f= n++;
g= ++n;

Получаем c не равно d, потому что между присвоениями индекс n менялся.
Получаем e=f=3 потому что между присвоениями индекс n не менялся/
Получаем g=f+2 потому что между присвоениями индекс n менялся дважды.

Кроме того надо иметь ввиду, что при неточной работе с индексами они могут при декременте или инкременте выйти за границы массива и программа может дать неправильный результат или (при защите границ) аварийно завершиться.
Вот так, как написано, это херота полная.. .
Конечно, понятно, что хитрожопый препод специально так запутал, чтобы вы мозгами пошевелили, но на деле:
int i = 5;
func(i++); - в функцию пойдет 5
func(++i); - в функцию пойдет 6
Это единственный "сложный" пример, который встретился мне за 500 лет программирования.
Обычно это:
myVar++;
Бывают, конечно, моменты, нужные для краткости или красоты кода.. . но это редко.
А в выражении что там делают три плюса вместе? Там имелось в виду с пробелом: y++ +++b/3
видимо...