11. Не понятно, как работает оператор ++ или --, особенно при его применении к указателям.
Автор ARV   
18.12.2009 г.

Оператор ++ или -- может быть префиксным и постфиксным, т.е. может стоять слева от переменной или справа от нее. В первом случае значение переменной изменяется до его использования в выражении, во втором - после использования.

int a = 2, x = 3, y;
y = a++ * x;
// здесь y=6, a = 3
y = a-- * x;
// здесь y=9, a=2
y = ++a * x;
// здесь y=9, a=3

Сравните результаты первого и последнего выражений: y имеет разные значения, хотя исходные условия одинаковые! Так происходит потому, что в первом случае при умножении на x используется значение переменной a еще до инкремента, а во втором случае - уже после инкремента.

 

В связи с такой особенностью крайне нежелательно использовать в одном операторе несколько операторов ++ или -- с одной и той же переменной, т.к. порядок вычисления в этом случае не определен стандартом языка Си - вы получите об этом предупреждение компилятора или даже сообщение об ошибке:

y = a++ * x - a++ / 2; // так делать нельзя!

Что касается указателей, то тут надо разделять случай инкремента (или декремента) самого указателя и значения по указателю.

int *ptr;
*ptr++; // берется значение по указателю, а затем инкрементируется указатель
ptr++; // инкрементируется сам указатель

Если вы сомневаетесь - используйте скобки, чтобы однозначно определить порядок вычислений (иногда без скобок вообще не обойтись - компилятор не поймет):

(*ptr)++; // тут ясно, что изменяется значение по указателю
*(ptr++); // тут будет взято значение по указателю, а затем указатель будет увеличен
*(++ptr); // тут будет взято значение по уже увеличенному указателю

Добавить в любимые (0) | Просмотров: 7440

  Ваш коментарий будет первым

Только зарегистрированные пользователи могут оставлять коментарии.
Пожалуйста зарегистрируйтесь или войдите в ваш аккаунт.