ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
12 июля
442408 Топик полностью
Ксения (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().