Portál AbcLinuxu, 4. prosince 2025 16:30
Řešení dotazu:
[/hint]
#include <stdio.h>
#define do(x) for(x) {
#define while }
void main(void) {
unsigned short i;
do (i=0; i<10; i++)
printf("%i\n", i);
while;
}
int main()
{
int i = 1;
int n = 7;
label_start:
i = i + 1;
if( i > n ) goto label_end;
/* do work */
goto label_start;
label_end:
return 0;
}
Na vysvetlenou. Nekonecny cyklus (simulujici do-while) je mezi label_start a goto label_start. Podminka na ukonceni pak je if se skokem mimo smycku.
Ano. Presne takhle se ve starych jazycich kodovaly tyhle veci. Dneska uz maji oba zminene konstrukce analogicke obou tymum cyklu a je skoda, ze si jich nevazite.
S ohledem na odpovědi mám trochu obavu, co vlastně víte. Takže pro pořádek:
for (INIT; COND; ITER) {
BODY;
}
lze (za předpokladu, že v těle nepoužijete continue) ekvivalentně přepsat jako
INIT;
while (COND) {
BODY;
ITER;
}
Pomocí do-while je to horší, protože ten vždy proběhne aspoň jednou. Takže by bylo potřeba použít nějaký špinavý trik typu
INIT;
do {
if (!(COND))
break;
BODY;
ITER;
while (true);
a samozřejmě ani tady to nebude fungovat správně, pokud v těle použijete continue.
Podstatná otázka samozřejmě je, k čemu je to dobré.
for(int i=1;…){
}
ale fungoval jako:
int i;
for(i=1;…){
}
což měnilo platný scope pro 'i'.
{
INIT;
while (COND) {
BODY;
ITER;
}
}
C EKVIVALENT V FORTRAN 77 DO
INTEGER I
INTEGER N
N=7
DO 10 I=1,N
C DO WORK
10 CONTINUE
STOP
END
totéž pomocí IF
C EKVIVALENT V FORTRAN 77 IF
INTEGER I
INTEGER N
10 IF (N=I) 40,30,20
20 I=I+1
C DO WORK
30 GOTO 50
40 PRINT 'CHYBA I JE VETSI NEZ N'
50 STOP
END
C EKVIVALENT V FORTRAN 77 IF
INTEGER I
INTEGER N
10 IF (N-I) 40,30,20
20 I=I+1
C DO WORK
30 GOTO 50
40 PRINT 'CHYBA I JE VETSI NEZ N'
50 STOP
END
jak už 20 let píšu do if podmínku, tak ty prsty to napsaly automaticky, přitom tohle FORTRANí IF je na číslo.
#define LIMIT 100
int i;
//--- FOR LOOP -----------
for(i = 0; i < LIMIT; i++)
f(i);
//--- WHILE LOOP -----------
i = 0;
while(i < LIMIT)
{
f(i);
i++;
}
//--- DO-WHILE LOOP -----------
i = 0;
if(i < LIMIT)
{
do
{
f(i);
} while(++i < LIMIT);
}
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.