powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Побочные эффекты в C.
8 сообщений из 8, страница 1 из 1
Побочные эффекты в C.
    #38186739
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

Читаю книгу Кернигана "Практика программирования". На скрине ниже показан пример, который я не понял:



В моём понимании, в данном случае, индексация пройдёт дважды не зависимо от того, какое выражение будет вычислено первым. Однако автор пишет иначе. Кто-нибудь понял этот момент?

С уважением, Андрей.
_______________________
Британские "учёные" - фундаментальный подход к разной фигне...
...
Рейтинг: 0 / 0
Побочные эффекты в C.
    #38186759
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

Индексация пройдет дважды. Переменная 'i' будет увеличена на 2.

А вот как будут вычислены индексы в момент индексации -- это не определено.

Недавно игрался с подобным кодом. Visual Studio инкрементировала переменную в обратном порядке -- в обратном по отношению к записи в выражении. И это в Debug. И с постфиксным инкрементом. А в Release Студия... просто вынесла все постфиксные инкременты за пределы вычисления выражения. И, я думаю, это правильно.

Тут есть момент. Не надо пользоваться подобными приемами. Они ничего не дают, а привносят недопонятки в код -- мама не горюй.

ЗЫ: gcc повел себя хуже.
...
Рейтинг: 0 / 0
Побочные эффекты в C.
    #38186761
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответ. Здесь мне только что, на конкретном примере, разъяснили почему ответ может оказаться неожиданным.
...
Рейтинг: 0 / 0
Побочные эффекты в C.
    #38186768
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumДоброго времени суток.

Читаю книгу Кернигана "Практика программирования". На скрине ниже показан пример, который я не понял:



В моём понимании, в данном случае, индексация пройдёт дважды не зависимо от того, какое выражение будет вычислено первым. Однако автор пишет иначе. Кто-нибудь понял этот момент?
Например, запись по str[i] дважды пройдет, а потом дважды увеличится переменная i. И "одна из позиций str может оказаться пропущенной". Даже две позиции будут пропущены.
...
Рейтинг: 0 / 0
Побочные эффекты в C.
    #38186779
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumСпасибо за ответ. Здесь мне только что, на конкретном примере, разъяснили почему ответ может оказаться неожиданным.
По вашей ссылке xvr в своем псевдокоде ошибся.

А вы в своих комментах не правильно понимаете понятие "выражение" в С++. В коде:
Код: plaintext
1.
str[i++] = str[i++] = ' ';


Тут нет "нескольких" выражений. Это одно "выражение", так сказать.
...
Рейтинг: 0 / 0
Побочные эффекты в C.
    #38186783
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravCompositumСпасибо за ответ. Здесь мне только что, на конкретном примере, разъяснили почему ответ может оказаться неожиданным.
По вашей ссылке xvr в своем псевдокоде ошибся.

А вы в своих комментах не правильно понимаете понятие "выражение" в С++. В коде:
Код: plaintext
1.
str[i++] = str[i++] = ' ';


Тут нет "нескольких" выражений. Это одно "выражение", так сказать.
Понимаю я правильно, но написал действительно неверно. Главное, что меня поняли :), хотя впредь постараюсь писать правильней.

petrav xvr в своем псевдокоде ошибся.
В чём ошибка? Ведь по сути он написал то же самое, что и вы:
petravНапример, запись по str[i] дважды пройдет, а потом дважды увеличится переменная i.
...
Рейтинг: 0 / 0
Побочные эффекты в C.
    #38186789
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumВ чём ошибка? Ведь по сути он написал то же самое, что и вы...
Ошибка тут:
Код: plaintext
1.
2.
3.
4.
5.
int i_tmp=i;
str[i_tmp]=' '; // Запись по первому индексу. Обновление i в результате i++ будет произведено позже
str[i_tmp]=' '; // Запись по второму индексу (неправильное). Еще одно обновление i в результате i++ будет произведено позже
i=i_tmp+1; // Первое обновление i
i=i_tmp+1; // Второе обновление i - неправильное


Если i==0 в начале алгоритма, то в конце i==1. А должно быть 2.

Просто... Не сочтите за обиду. =) Это мелочи. Но важные.
...
Рейтинг: 0 / 0
Побочные эффекты в C.
    #38186793
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, теперь увидел... Должно было быть так:
Код: plaintext
1.
2.
3.
4.
str[i]=' '; // Запись по первому индексу. Обновление i в результате i++ будет произведено позже
str[i]=' '; // Запись по второму индексу (неправильное). Еще одно обновление i в результате i++ будет произведено позже
i+=1; // Первое обновление i
i+=1; // Второе обновление i


Спасибо.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Побочные эффекты в C.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]