Исходник
Код
int main()
{
volatile int ps1 = 1;
volatile int cnt = 0;
#if 0
while(ps1--)
{
cnt++;
printf("%i, %i", cnt, ps1);
}
#else
if(ps1 > 0)
{
do
{
cnt++;
printf("%i, %i", cnt, ps1);
} while(--ps1);
}
#endif
return 0;
}
Для while{}
Код
00000000 <main>:
0: e3a02001 mov r2, #1
4: e3a03000 mov r3, #0
8: e52de004 push {lr} ; (str lr, [sp, #-4]!)
c: e24dd00c sub sp, sp, #12
10: e58d2000 str r2, [sp]
14: e58d3004 str r3, [sp, #4]
18: ea000006 b 38 <main+0x38>
1c: e59d3004 ldr r3, [sp, #4]
20: e2833001 add r3, r3, #1
24: e58d3004 str r3, [sp, #4]
28: e59d1004 ldr r1, [sp, #4]
2c: e59f0028 ldr r0, [pc, #40] ; 5c <main+0x5c>
30: e59d2000 ldr r2, [sp]
34: ebfffffe bl 0 <printf>
38: e59d3000 ldr r3, [sp]
3c: e3530000 cmp r3, #0
40: e2433001 sub r3, r3, #1
44: e58d3000 str r3, [sp]
48: 1afffff3 bne 1c <main+0x1c>
4c: e3a00000 mov r0, #0
50: e28dd00c add sp, sp, #12
54: e49de004 pop {lr} ; (ldr lr, [sp], #4)
58: e12fff1e bx lr
5c: 00000000 .word 0x00000000
Для do {} while()
Код
00000000 <main>:
0: e3a03000 mov r3, #0
4: e3a02001 mov r2, #1
8: e52de004 push {lr} ; (str lr, [sp, #-4]!)
c: e24dd00c sub sp, sp, #12
10: e58d2000 str r2, [sp]
14: e58d3004 str r3, [sp, #4]
18: e59d3000 ldr r3, [sp]
1c: e3530000 cmp r3, #0
20: da00000b ble 54 <main+0x54>
24: e59d3004 ldr r3, [sp, #4]
28: e2833001 add r3, r3, #1
2c: e58d3004 str r3, [sp, #4]
30: e59d1004 ldr r1, [sp, #4]
34: e59f0028 ldr r0, [pc, #40] ; 64 <main+0x64>
38: e59d2000 ldr r2, [sp]
3c: ebfffffe bl 0 <printf>
40: e59d3000 ldr r3, [sp]
44: e2433001 sub r3, r3, #1
48: e3530000 cmp r3, #0
4c: e58d3000 str r3, [sp]
50: 1afffff3 bne 24 <main+0x24>
54: e3a00000 mov r0, #0
58: e28dd00c add sp, sp, #12
5c: e49de004 pop {lr} ; (ldr lr, [sp], #4)
60: e12fff1e bx lr
64: 00000000 .word 0x00000000
Компилятор gcc-5.2.0. Сборка arm-none-eabi-gcc -c 1.c -O2 -o 0.o
Что говорит букварь
Код
if() <- проверка - один раз; переход один раз в плохом случае
do
...
while <- проверка и переход каждую итерацию
Код
while <- проверка - каждую итерацию, переход - один раз в конце
{
...
} <- переход каждую итерацию
для while всегда имеем +1 переход
Цитата
но побоялся справедливого гнева настоящих кодеров, которые ассерты не используют.
программа, по воможности, должна работать при любых ошибках. assert - это аварийное завершение. по сути перекладывание проблемы с разработчика на пользователя.
когда запускаешь программу и видишь аварийный выход из-за какой-то ерунды во входных параметрах, хочется испепелить разработчика, который не осилил правильную передачу вверх ошибки или
использование исключения.