Как можно "пока (я == я);" быть бесконечным циклом в однопоточном приложении? - PullRequest
141 голосов
/ 23 января 2009

Я только что получил вопрос, на который я не могу ответить.

Предположим, у вас есть это определение цикла в Java:

while (i == i) ;

Каков тип i и значение i, если цикл не является бесконечным циклом и программа использует только один поток ?

Ответы [ 12 ]

0 голосов
/ 19 июля 2009

Я был удивлен, не увидев этого решения:

while (sin(x) == sin(x)) //probably won't eval to true

В ответ на комментарий попробуйте выполнить следующее:

double x = 10.5f;
assert (x == asin(sin(x)));

x всегда должен быть равен арксинусу (sin (x)) в теории, но на практике это не так.

0 голосов
/ 23 января 2009

Я знаю, что это вопрос Java, но рассмотрение вопроса для других языков интригует.

В C простой тип, такой как 'int', может демонстрировать 'прекращение до того, как юниверс станет холодным', если 'i' объявлено как энергозависимое (поэтому компилятор будет вынужден сделать два чтения 'i' для каждой итерации), и если 'i' действительно было в памяти, где что-то еще могло повлиять на это. Затем цикл завершается, когда «i» изменяется между двумя чтениями одной итерации. ( Добавлено : возможное место - в микрокомпьютере, где «i» фактически находится по адресу порта ввода / вывода, возможно, подключенного к датчику положения. Было бы более правдоподобно, если «i» 'была переменной-указателем (указателем на энергозависимую память), а оператор был' while (*i == *i); '.)

Как свидетельствуют другие ответы, в C ++ оператор '==' может быть предоставлен пользователем, если я принадлежу к пользовательскому классу, поэтому все может быть возможно.

Скорее, чем NaN, в языке на основе SQL цикл не был бы бесконечным, если бы значение i было NULL; однако любое значение, отличное от NULL, сделает цикл бесконечным. Это скорее похоже на Java, где любое число (в отличие от NaN) делает цикл бесконечным.

Я не вижу, чтобы конструкт имел какое-либо практическое применение, но это интересный вопрос о пустяках.

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