Portál AbcLinuxu, 10. května 2025 05:55
Řešení dotazu:
#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 ENDtotéž 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 ENDjak 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.