Почему эта функция не чистая? - PullRequest
1 голос
/ 06 июля 2019

В статье Википедии https://en.wikipedia.org/wiki/Pure_function#Impure_functions говорится, что следующая функция не является чистой.

int f(int* x) 
{
    return *x;
}

Почему это? Функция будет возвращать то же значение для того же аргумента, верно? Будет ли он считаться чистым, если бы это была не изменяемая ссылка, как показано ниже?

int f2(const int* x) 
{
    return *x;
}

Ответы [ 2 ]

4 голосов
/ 06 июля 2019

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

#include <stdio.h>

int main() {
   int i = 3;
   int * const x = &i;
   printf("%d\n", f(x));
   i = 4;
   printf("%d\n", f(x));
   return 0;
}

Поскольку x не меняется между двумя вызовами, второй вызов на f(x) может быть оптимизирован (в пользу повторного использования результата первого вызова), если f был чистым. Очевидно, что это может привести к неправильному результату, поэтому f не является чистым.

f2 не чист по той же причине.

2 голосов
/ 06 июля 2019

Правило 1 гласит:

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

Дело в том, что аргумент - это не значение, указанное x, а адрес указателя.Вы передаете адрес функции.

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

Конечно, это не будет правдой, если f или f2 вернет int* вместо int.В этом случае один и тот же аргумент приведет к тому же возвращаемому значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...