Чтобы расширить мои комментарии, текст этой книги неясен, что запутывает проблему.
Как я уже сказал, эта книга пытается сказать: «Давайте заставим бесконечное количество обезьян написать все мыслимые функции C ++, которые когда-либо могли быть написаны. Будут случаи, когда мы выберем переменную, которая (какую-то конкретную функцию, которую написали обезьяны) использует, мы не можем понять, изменит ли функция эту переменную ".
Конечно, для некоторых (даже многих) функций в любом приложении это может быть определено компилятором, и это очень легко. Но не для всех (или обязательно для большинства).
Эту функцию легко проанализировать так:
static int global;
void foo()
{
}
"foo" явно не изменяет "global". Он вообще ничего не меняет, и компилятор может с этим легко справиться.
Эту функцию нельзя так анализировать:
static int global;
int foo()
{
if ((rand() % 100) > 50)
{
global = 1;
}
return 1;
Поскольку действия "foo" зависят от значения, которое может изменяться во время выполнения , во время компиляции явно невозможно определить , изменит ли он "global".
Всю эту концепцию понять намного проще, чем предполагают компьютерные ученые. Если функция может делать что-то другое в зависимости от того, что может измениться во время выполнения, то вы не можете понять, что она будет делать, пока не запустится, и каждый раз, когда она запускается, она может делать что-то другое. Доказуемо это невозможно или нет, но очевидно невозможно.