powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что понимается под "побочными эффектами" выражений?
19 сообщений из 19, страница 1 из 1
Что понимается под "побочными эффектами" выражений?
    #38503183
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.
Читаю это .
"Advanced Programming in the UNIX Environment, 3rd Edition", стр. 151The difference between getc and fgetc is that getc can be implemented as a macro, whereas fgetc cannot be implemented as a macro. This means three things:

- The argument to getc should not be an expression with side effects.
- Since fgetc is guaranteed to be a function, we can take its address. This allows us to pass the address of fgetc as an argument to another function.
- Calls to fgetc probably take longer than calls to getc, as it usually takes more time to call a function.Не понял фразу "expression with side effects" (перевожу как "выражения с побочными эффектами). Что это за "побочные эффекты"?

Спасибо.
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38503238
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

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

это естественно самый простейший случай, есть конечно и другие.
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38503261
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

именно здесь имеется в виду то, что это не должно быть выражение, вообще что то меняющее.

хотя я вот лично не понимаю почему.
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38503270
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
j = i++;


Побочный эффект - изменение i.
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38503295
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pirovindos
Код: plaintext
1.
j = i++;



Побочный эффект - изменение i.
И каким боком этот побочный эффект можно прикрутить к сигнатурам:
Код: plaintext
1.
2.
3.
#include<stdio.h>
int getc(FILE* stream);
int fgetc(FILE* stream);


В качестве параметра передаётся ссылка на поток. Какие побочные эффекты возможны при передачи такой ссылки?
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38503304
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

в том то и дело, что почти никаким.

можно массив файлов и указатель в нем или индекс. и типа в цикле из каждого файла читаем по символу и как-то обрабатывать.
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38503306
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

и главное - почему это нельзя вдруг вставать в макрос.
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38503316
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Честно говоря, в данном случае, мне был бы более понятен конкретный пример кода, демонстрирующий ситуацию с "побочным эффектом", при котором удаётся использовать функцию fgetc, но не удаётся getc.
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38503332
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivпочему это нельзя вдруг вставать в макрос.В макросе входной "аргумент" может быть использован более одного раза. Тогда, если это выражение-аргумент что-то изменяет, то оно сработает не очевидным образом.
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38503471
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftВ макросе входной "аргумент" может быть использован более одного раза. Тогда, если это выражение-аргумент что-то изменяет, то оно сработает не очевидным образом
В данной теме речь идёт о конкретных функциях с конкретными сигнатурами .
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38503474
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftMasterZivпочему это нельзя вдруг вставать в макрос.В макросе входной "аргумент" может быть использован более одного раза. Тогда, если это выражение-аргумент что-то изменяет, то оно сработает не очевидным образом.

Ну да, об этом я не подумал.
Но это был бы очень хреновый макрос.
И уж точно getc таким бы не был.
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38503491
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumЧестно говоря, в данном случае, мне был бы более понятен конкретный пример кода, демонстрирующий ситуацию с "побочным эффектом", при котором удаётся использовать функцию fgetc, но не удаётся getc.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
FILE* files[20];
char fname[MAXPATH];
for(int i = 0; i < 20; ++ i)
{
  sprintf(fname, "file%d", i);
  files[i] = fopen( fname, "r" );
}

int ch = 0;
int i = 0;
do
{
  if(i>=20)
    break;
  
  ch = getc(files[i++]);
  
}while( ch !='\n' );
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38503519
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Код: plaintext
1.
ch = getch(files[i++]);


getch в моём вопросе не фигурировал. :)
Задал вопрос на stackoverflow и получил понятные мне ответы с примерами. Если кому интересно, то можно глянуть здесь .

Спасибо.
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38503689
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumMasterZiv
Код: plaintext
1.
ch = getch(files[i++]);


getch в моём вопросе не фигурировал. :)
Задал вопрос на stackoverflow и получил понятные мне ответы с примерами. Если кому интересно, то можно глянуть здесь .

Спасибо.

Описался. Должно быть getc();
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38503966
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositummiksoftВ макросе входной "аргумент" может быть использован более одного раза. Тогда, если это выражение-аргумент что-то изменяет, то оно сработает не очевидным образом
В данной теме речь идёт о конкретных функциях с конкретными сигнатурами . http://stackoverflow.com/questions/20629059/how-can-an-expression-with-side-effects-be-passed-to-getc?noredirect=1#comment30877382_20629059 the expression files[counter++] could be evaluated more than once, leading to unexpected behavior.о чем я и говорил...
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38504054
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftо чем я и говорил...
Однако в комментариях этому человеку пишут:
Jim BalterYou have no idea what you're talking about.
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38504076
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашел в C++Builder 6 код getc()
Код: plaintext
1.
2.
3.
#define getc(__f) \
  ((--((__f)->level) >= 0) ? (unsigned char)(*(__f)->curp++) : \
    _fgetc (__f))

Если в качестве "аргумента" __f "передать", к примеру, files[counter++], то насколько увеличится в итоге counter?
Будь getc() обычной функцией, то counter увеличился бы ровно на единицу. А в случае с макросом - явно больше.
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38504082
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,

Короче.
Проблема обсуждаемая не стоит столь пристального внимания.
Просто надо знать, что getc может быть макросом (а может и не быть).
И при её вызове надо думать, что делаешь. Если думать не хочешь, надо использовать fgetc
(который, кстати, не смотря на то, что он функция, можэт тоже замечательно встроится (inline) и
таким образом быть и быстрым, и лишённым таких проблем).
...
Рейтинг: 0 / 0
Что понимается под "побочными эффектами" выражений?
    #38504328
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositummiksoftо чем я и говорил...
Однако в комментариях этому человеку пишут:
Jim BalterYou have no idea what you're talking about.
Это возражение на утверждение что только в плохо написаной стандартной либе в макросе аргумент будет дважды вычисляться.
В качестве опровержения приводится в пример либа от оригинального компилятора С.
Как бы намекая что уж она то хорошо написана.
А на самом деле исходное утверждение абсолютно корректно, потому что только в плохо написаной стандартной либе будет использован макрос, когда любой самый дохлый современный компилятор умеет инлайн функции
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что понимается под "побочными эффектами" выражений?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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