2017-02-16 2 views
1

Я провел несколько упражнений из рекомендованного book, который я нашел на этом веб-сайте. Я наткнулся на эту следующую базовую часть кода, которую я не мог полностью понять.Непонимание в базовом для цикла (C)

#include <stdio.h> 

int main(void) 
{ 

int i; 

for (i = 10; i >= 1; i /= 2) 
    printf("%d ", i++); 

return 0; 
} 

Это мои рассуждения позади этого фрагмента программы:

  1. Переменная i инициализируется 10.
  2. i проверено, больше или равно 1 (что всегда так).
  3. Третье выражение гласит: i = i/2, таким образом i делится на 2 и его значение хранится в i.
  4. В инструкции printfi добавлено после каждая printf справка.

Я просто не могу понять, почему выход этой программы:

1 1 1 1 1 1 1 1 ...

Я понимаю, что условие утверждение всегда верно, однако, не должно быть первым значением:

5 3 2 1 1 1 1 1?

В принципе, я не могу понять, почему значение i сейчас хранится как 1. Любые исправления в отношении моих рассуждений и/или понимания по этому вопросу будут оценены. Пожалуйста, извините основной характер этого вопроса.

+5

Выход: '10 5 3 2 1 1 1 ...': См. Http://ideone.com/6qnGdC – abelenky

+0

Убедитесь, что i является int. Проверьте свой двоичный файл (удалите его, затем перекомпилируйте и убедитесь, что отметка времени верна). – jgmjgm

+1

Показать весь код ([MCVE]). –

ответ

3

Как указал А.Бабеленки, правильный выход - 10 5 3 2 1 1 1 .... Единственная ошибка, которую вы произнесли в своих рассуждениях, заключается в том, что утверждение i /= 2 оценивается после тела цикла for, прежде чем снова проверить условие. Другой способ, чтобы написать поэтому тот же цикл будет

for(i = 10; i >= 1; i = (i + 1)/2) 
    printf ("%d ", i); 

Если вы работаете в Windows, попробуйте пейджинг выход через more: myprog | more. Это должно позволить вам увидеть начало вывода этого бесконечного цикла. На машине linux вы можете получить тот же результат, используя more или less: myprog | less. Спасибо @EugeneSh за то, что он сделал предложение, что это может быть проблемой.

Другой способ, который я нашел, чтобы посмотреть первоначальный выход для таких программ, как это ударить Ctrl +C сразу после запуска программы с Enter. Это не «стандартный» метод и может потребовать очень быстрых рефлексов, чтобы получить какие-либо результаты для быстрого цикла, подобного вашему.

Окончательное предложение ограничить выход вы производите непосредственно из программы:

int i, count; 
for(i = 10, count = 0; i >= 1 && count < 100; i /= 2, count++) 
    printf("%d ", i++); 

Это добавит счетчик, который остановит свой выход после того, как 100 номеров были напечатаны и позволяет увидеть первые цифры ,

+0

Спасибо за ваш вклад по этому вопросу. Я думаю, что это на самом деле то, что происходит. Я работаю на Visual Studio 2015, будет ли способ изменить настройки моей консоли, чтобы я мог видеть начало вывода? Или вы упомянули единственный способ пойти? –

+0

@ Rizzo. Я не уверен, как это сделать в VS, но вы всегда можете запустить его с терминала, и в этом случае мой способ будет работать. –

+1

@ Rizzo. См. Дополнительное редактирование. Я думаю, что это может быть самым полезным для вас, так как вы можете сделать это прямо в VS. –

0

На второй строке у вас есть «i ++». Таким образом, на каждой итерации цикла он также увеличит i на 1.

Итак, предположим, что i = 1 при запуске цикла. Сначала он будет разделен на 2 (i/= 2). Так как i - целое число, оно станет 0. Тогда во второй строке у вас есть «i ++», тем самым увеличивая i.

Итак, к концу итерации цикла я вернусь к тому, чтобы быть равным 1 (тем самым сделав этот цикл бесконечным).

+2

Хотя то, что вы говорите, верно, ОП уже получил эту часть и объяснил ее сам. Это не отвечает на фактический вопрос OP вообще. –

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

  • Нет связанных вопросов^_^