Ксения (16.09.2013 15:50 - 15:58, просмотров: 100) ответил Mazur на :) Победители: Bill и Скрипач. Я только вчера встретил пример while(x).
while() здесь победил, поскольку такой код ... ближе всего к ассемблеру! :) Именно так бы мы организовали цикл на ассемблере - на убывании счетчика, а не на его возрастании. Так же был когда-то организован цикл на Fortran'е. А у процессоров x86 вообще есть инструкция "LOOP address", которая одновременно с переходом по адресу декрементирует регистр CX, обычно используемый в качестве счетчика в циклах. Несомненно, сделали такую инструкцию именно для этого - крутить циклы "назад".
И тем не менее, судя по вашей реакции, вы еще не вкусили прелестей Си в полную меру :). Иначе бы поняли, что цикл for() можно крутить не только вперед по нарастающей значения счетчика, но и назад. Более того, все три оператора внутри его скобок, не являются обязательными, а потому могут опускаться за ненадобностью (но точки-с-запятой должны от них оставаться!). И тогда окажется, что
while(n--) {}
это тоже самое, что
for( ; n--; ) {}
Да и вообще, циклы for крутятся назад еще экономичнее, чем вперед. Причем, обычно конструкция бывает такой:
for( n = сколько_раз_крутить; n--; ) {}
Но если счетчик нужен одновременно и как индекс для массива, то так:
for( i = сколько_раз_крутить; --i >= 0; ) { buf[i]=... } // на беззнаковых i это не работает
Собственно ради удобства совмещения индекса со счетчиком цикла оператор for и был придуман! Иначе было бы достаточно while().