LINUX.ORG.RU

Небольшой вопрос по указателям в Си

 ,


0

1

Здравствуйте!Читаю книгу Брайна Кернигана Язык программирования С, 2-е издание. На странице 118 есть пример реализации стека с помощью указателей:

*p++ = val; /* помещение val в стек */
val = *--p; /* извлечение val из стека */
Насколько я помню у операций * и ++/-- одинаковый приоритет и выполняются они справа налево. Выходит что сначала вершина стека увеличивается, а затем добавляется элемент. Во втором случае получается что сначала вершина стека уменьшается, а затем элемент извлекается. В данном случае извлечется не val, а то что лежит «ниже» его. Или я ошибаюсь?

1. Унарные операции имеют больший приоритет по сравнению с бинарными.
2. Суффиксные операции имеют больший приоритет по сравнению с префиксными.
Это сходу.

Northsoft ★★
()

Кажется я не учел, что в *p++ постфиксная операция инкремента

JamesMoore
() автор топика
Ответ на: комментарий от Northsoft

Спасибо! Тут же как раз обе операции унарные? Как я с запозданием додумался тут как раз второй пункт подходит.

JamesMoore
() автор топика
Ответ на: комментарий от JamesMoore

Что касается этого:

Выходит что сначала вершина стека увеличивается

Нет.

int i = 3;
printf("%d\n", i++); /* будет выведено «3» */
Запомните правило для суффиксного и постфиксного инкремента (декремента):
1. Если инкремент идёт до операнда, то применяется инкремент до взятия значения выражения.
2. Если инкремент идёт после операнда, то применяется инкремент после взятия (и запоминания) значения выражения.
Любите Си. :)

Northsoft ★★
()
Ответ на: комментарий от Northsoft

Спасибо за помощь, Norhsoft, Balantay! Все понятно теперь. П.С. Хорошо что в Rust нет операций инкремента и декремента

JamesMoore
() автор топика
Ответ на: комментарий от Andrey_Utkin

в FAQ по Rust написано:

Preincrement and postincrement, while convenient, are also fairly complex. They require knowledge of evaluation order, and often lead to subtle bugs andundefined behavior in C and C++. `x = x + 1` or `x += 1` is only slightly longer, but unambiguous.

JamesMoore
() автор топика
Ответ на: комментарий от JamesMoore

Хорошо что в Rust нет операций инкремента и декремента

Потому что Rust не писали, в отличие от C, на основе DECовского ассемблера (DECовской системы команд).

DeVliegendeHollander ★★
()
Ответ на: комментарий от DeVliegendeHollander

В x86 аппаратный инкремент и декремент тоже есть.

Но я уже боюсь спрашивать, есть ли он в ARM. Неужели...

anonymous
()
Ответ на: комментарий от anonymous

И?

При чём тут наличие аппаратного инкремента и декремента в различных архитектурах?

Суть-то в том, что базой для С был DECовский ассемблер, а Rust спроектирован как полностью независимый от платформы язык.

А инкремент/декремент даже в программируемых микрокалькуляторах был — и чо теперь? :-)

DeVliegendeHollander ★★
()
Ответ на: комментарий от Balantay

A++ - постинкремент, ++А - преинкремент.

Не следует еще забывать что у постинкримента и преинкремента разные приоритеты(у префиксного он больше). Что может привести к весьма неприятным последствиям).

BlackJack
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.