2015-04-23 5 views
1

Sry Я новичок в языке C. Может кто-то помочь мне понять, что происходит в «для» цикла:Проверяет ли счетчик в цикле for цикл цикла?

Когда я запускаю этот код я не получаю ничего, это даже не входя петля:

for(count=0 ;count--;count--) 
{ 
    printf("\n%5d", count); 
} 

И когда я запускаю этот код, я получаю бесконечные входы в петле:

for(count=1 ;count--;count--) 
{ 
    printf("\n%5d", count); 
} 

И когда я запускаю этот код, я получаю 1 вход в цикл:

for(count=2 ;count--;count--) 
{ 
    printf("\n%5d", count); 
} 

И так далее для каждого графа = нечетного числа я получаю бесконечные входы, и для каждого графа = четного числа я получаю ограниченное количество входов

Может кто-нибудь объяснить мне, почему это hapening?

+3

Прочтите эту статью: http://www.thegeekstuff.com/2012/12/c-loops-examples/ и вернитесь к нам, если у вас появилось больше вопросов после прочтения. – Cristik

ответ

0

Я думаю, вам сначала нужно точно знать, что такое count--. Это означает, что первый count будет оцениваться как часть условия, а затем уменьшен. Это означает, что count-- в этом случае 0, что делает условие цикла цикла равным 0. После того, как условие оценивается, count - -1, но это не имеет значения, поскольку счет был равен 0 во время проверки условия, поэтому цикл никогда не запускается.

for(count = 0;count--;count--) 
{ 
    printf("\n%5d", count); 
} 

На следующий цикл начинается отсчет на 1, что означает count-- будет оцениваться с 1, это делает проверку состояния для цикла, равного 1. После оценки счет становится 0. Это означает, что цикл for будет вводить и распечатывать сообщение. Когда кодовый блок заканчивается, выполняется инструкция count--, устанавливая count - -1. Затем мы снова проверяем. Мы видим, что count-- оценивает -1, поэтому мы снова зацикливаемся. После оценки count будет установлен на -2, и мы снова войдем в цикл for. Эта функция работает вечно, потому что счетчик всегда будет нечетным, когда мы перейдем к проверке цикла цикла, поэтому счет никогда не может быть 0, и мы никогда не прерываем цикл.

for(count = 1;count--;count--) 
{ 
    printf("\n%5d", count); 
} 

Теперь вы должны быть в состоянии понять, почему последний работает только один раз:

for(count=2 ;count--;count--) 
{ 
    printf("\n%5d", count); 
} 

Очевидно после первого evalution, count получает убавления. Затем, как только блок кода будет выполнен, он будет уменьшен снова. Поэтому, когда мы получаем условную проверку в цикле for, count - 0, и мы ломаемся.

1
  1. for(left;middle;right) Среднее выражение условие - выражение, которое является контекстуально конвертируемым в BOOL. Это выражение оценивается перед каждой итерацией, и если оно дает false (или 0 в случае int), цикл завершается.

  2. foo-- - это пост-оператор, что означает, что значение foo оценивается первым, а затем оно декрементируется.

Подставив эти два вместе,

Вариант 1: Перед входом в цикл, count-- оценивается. Текущее значение счетчика равно 0. Таким образом, цикл не выполняется.

Case2: count-- - 1, loop вводится один раз. count-- выполняется в конце цикла. count-- теперь оценивает -1 в начале цикла, поэтому цикл выполняется снова и так далее - ad infinitum

Case3: count-- is 2, конец цикла - 0, поэтому выходы цикла после 1-й итерации.

Смежные вопросы