Почему эта петля работает бесконечно - PullRequest
24 голосов
/ 28 ноября 2011

Это простой цикл while в C #, но он работает бесконечно.

int count = 1;
while (count < 10)
{
    count = count++;
}

Почему это так?

Ответы [ 8 ]

58 голосов
/ 28 ноября 2011

Выражение count++ возвращает исходное значение count, а затем увеличивает значение.

Таким образом, вы каждый раз перезаписываете счет с одним и тем же значением. Просто сделай это:

count++;

Для любопытных, вот ссылка на статью Эрика Липперта, в которой проводится различие между приоритетом оператора и порядком вычисления - это интересное прочтение:

http://blogs.msdn.com/b/ericlippert/archive/2009/08/10/precedence-vs-order-redux.aspx

35 голосов
/ 28 ноября 2011

Это зациклится бесконечно.

Существует два типа приращения переменной:

Здесь count++ и ++count оба отличаются, если вы использовали ++count, это будет работать.

Здесь count = count++ означает, что переменная счетчика будет увеличена на единицу, а затем назначит более раннее значение 1 самой переменной счетчика, так что счет останется неизменным.

27 голосов
/ 28 ноября 2011

count = count++; делает не приращение count на единицу.x++ является оператором приращения post , что означает, что значение, возвращаемое выражением, является значением old .Таким образом, в вашем коде происходит следующее:

int oldValue = count;
count = count + 1;
count = oldValue;

То, что вы, вероятно, хотели написать, было count++; (без "count =").

Более подробно об этом можноможно найти в следующем вопросе SO:

7 голосов
/ 28 ноября 2011

Оператор ++ сначала сохраняет текущее значение, затем увеличивает его и, наконец, возвращает сохраненное значение, поэтому count никогда не изменится.

Eiter использует оператор ++ или выполняет присваивание.Все они эквивалентны:

count++;
count += 1;
count = count + 1;
5 голосов
/ 28 ноября 2011
count  = count++;

Это постинкремент.Это делает следующее.

int temp = count;
count++;
count = temp;

Так что вы не увеличиваете счет.Вместо этого используйте следующее:

while (count  < 10)
{
    ++count;
}
1 голос
/ 28 ноября 2011

потому что

count++

возвращает count, а не count + 1

просто с числом ++ без присваивания или:

count = ++count;

последний только дляобъясните, но вы не должны его использовать ...

из: ++ Оператор (C # Reference)

Первая форма - операция приращения префикса.Результатом операции является значение операнда после его увеличения.

Вторая форма - это операция постфиксного приращения.Результатом операции является значение операнда до его приращения.

Числовые и перечислительные типы имеют предопределенные операторы приращения.Пользовательские типы могут перегружать оператор ++.Операции над целочисленными типами обычно допускаются при перечислении.

0 голосов
/ 30 ноября 2011

Позвольте мне задать вам вопрос, почему вы делаете две операции с одной переменной, пока одной достаточно?каково было ваше намерение?самого count ++ было достаточно, так что зачем снова назначать count.Может быть, вы хотите сделать что-то еще.Вы можете иметь только count ++ или ++ count или count + 1.Я думаю, что другие способы вызывают две операции.Извините за мой способ написания.

0 голосов
/ 29 ноября 2011

Это бесконечно, потому что вы не увеличиваете счетчик.

count = count ++;присваивает значение 1 для подсчета, а затем увеличивает счетчик, но так как вы не назначаете счетчик увеличенных значений, он никогда не увеличивается.

Вам необходимо сделать либо:

count++;

, либо

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