Главная arrow Начинающим arrow FAQ по языку Си arrow 11. Не понятно, как работает оператор ++ или --, особенно при его применении к указателям.  
29.03.2017 г.
Главная
Проекты
Статьи
Начинающим
Архив новостей
Ссылки
Контакты
Поиск
Файлы
Форум
Карта сайта
Авторизация





Забыли пароль?
Ещё не зарегистрированы? Регистрация
Поддержи наш сайт!
Через WebMoney

 R785211844650
 Z210696637574
 E368177590409

Простые устройстваОтличные товары по превосходным ценамОтличные товары по превосходным ценам
11. Не понятно, как работает оператор ++ или --, особенно при его применении к указателям. Печать E-mail
Рейтинг: / 5
ХудшаяЛучшая 
Автор 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) | Просмотров: 5220

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

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

 
« Пред.   След. »
Полезные материалы по сходным темам
Кто на сайте?
Сейчас на сайте находятся:
1 гость
Помощь on-line
BannerFans.com