Не понял вопрос про x[i] и *x[i] - это ведь две совершенно разные вещи Может, ты имеешь ввиду x[i] и *(x+i) ??
Совершенно одинаковые. ПО ОПРЕДЕЛЕНИЮ. Но причём тут єто к написанному мной примеру?
А по поводу вида цикла, так зацикливаться на одном виде только ради полумифической оптимизации? Не понимаю такого. Значит я или ненормальный или не пацан :-)
Начнём с того, что часто придётся писать
if(len) do { } while(--len);что у более-менее вменяемого компилятора даст код, неотличимый от
for(;len;--len) { }За исключением варианта, когда вдруг захочется в цикле сделать continue; - тогда в do - while придётся делать goto на конец. Далеко не всегда можно идти по массиву "назад", в таком случае do - while потребует дополнительной переменной для индексации массива. Но даже если можно идти задом наперёд - всё равно некрасиво
do { x[len-1] ... } while(--len);массивы-то с 0 индексуются. Если даже не надо проверять len в начале (гарантированно не 0 или на 0 уже проверили выше и ругнулись), всё равно - в большинстве случаев разница for и do-while очень мала и в объёме кода, и в его быстродействии. У приличного хоть немного современного компилятора.
void foo(unsigned char *p, unsigned char len) { do *p++ = 0; while(--len); } void foo1(unsigned char *p, unsigned char len) { unsigned char i; for(i=0; iavr-gcc -O2 -S foo.c .file "foo2.c" .arch avr2 __SREG__ = 0x3f __SP_H__ = 0x3e __SP_L__ = 0x3d __tmp_reg__ = 0 __zero_reg__ = 1 .global __do_copy_data .global __do_clear_bss .text .global foo .type foo, @function foo: /* prologue: frame size=0 */ /* prologue end (size=0) */ mov r31,r25 mov r30,r24 .L2: st Z+,__zero_reg__ subi r22,lo8(-(-1)) brne .L2 /* epilogue: frame size=0 */ ret /* epilogue end (size=1) */ /* function foo size 7 (6) */ .size foo, .-foo .global foo1 .type foo1, @function foo1: /* prologue: frame size=0 */ /* prologue end (size=0) */ tst r22 breq .L12 mov r31,r25 mov r30,r24 .L10: st Z+,__zero_reg__ subi r22,lo8(-(-1)) brne .L10 .L12: ret /* epilogue: frame size=0 */ /* epilogue: noreturn */ /* epilogue end (size=0) */ /* function foo1 size 9 (9) */ .size foo1, .-foo1 /* File "foo2.c": code 16 = 0x0010 ( 15), prologues 0, epilogues 1 */