2016-06-15 2 views
0

ПочемуПочему `while ((ch = getchar())! = EOF)` общая идиома?

while ((ch = getchar()) != EOF) { 
    // stuff 
} 

чаще/предпочтительным/считается лучше, чем ниже?

ch = getchar(); 
while (ch != EOF) { 
    // stuff 
    ch = getchar(); 
} 

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

Для:

  • Шортер.
  • Все делается в состоянии.
  • Не забудьте переписать условие перед циклом и в конце цикла.

Против:

  • Смешение.
  • Уступка в цикле (запутанная? Беспорядочная?).
  • Потенциально неинициализированная переменная в состоянии цикла (она назначается , но это может быть не сразу очевидным).
  • Сравнение и назначение сохраняются аккуратно разделенными, сохраняя менталитет «одна линия, одна задача» во втором формате.
  • Для каждого задания будет одно сравнение, поэтому сложность в обоих случаях будет одинаковой, поэтому предпочтительнее понимать форму .

Существуют ли другие примеры использования подобной структуры?

У меня такое ощущение, что этот вопрос вызовет мнения, поэтому я бы попросил, чтобы они были подкреплены какой-то причиной. Беглый поиск не выявил дубликатов этого вопроса, поэтому я надеюсь, что это не дубликат!

+1

Я думаю, что лучший способ был бы для: (ch = getchar(); ch! = EOF; ch = getchar()) ' – Nishant

+0

Я бы использовал для (ch = getchar(); ch! = EOF; ch = getchar()) вместо второго варианта EDIT: ^^ Взял слова из уст –

+6

Причина, по которой ваша альтернативная форма не используется, связана с принципом [DRY] (https://en.wikipedia.org/ вики/Don% 27t_repeat_yourself). Это также относится к решению 'for' loop, которое, кажется, сегодня популярно. – user3386109

ответ

0

Код, который вы показываете, является общим, потому что он был указан в оригинальной книге K & R C. Вы можете увидеть пример начинающего программиста смущает это прямо здесь: reading k&r(c book) and confusing 1st chapter code

Мое личное предпочтение либо таким образом, или это:

for (int ch = getchar(); ch != EOF; ch = getchar()) 

Или это:

for (int ch; (ch = getchar()) != EOF;) 

Есть множество способов кожи кошки. Но K & R сперва его первым.

+0

У вас есть идеи, почему они предложили эту конкретную форму? Предположительно, это было связано с ограничениями памяти и желанием быть максимально краткими с их кодом. – jamesh625

+4

'while ((ch = getchar())! = EOF) только один раз расширяет макрокоманду' getchar() ', а не пару раз; это предпочтительнее. –

+0

@ jamesh625 Потому что, когда книга K & R была написана, авторы еще не знали ни одной вещи о том, что делает хорошую практику программирования и читаемый код. Стандарты де-факто промышленности для надлежащего проектирования программ и считываемого кода еще не были решены. Книга была написана в середине 70-х годов, она древняя и полностью устаревшая. – Lundin

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