My friends tell me that a special loop exists that isn't a 'while' loop or a 'do while' loop.
Does anyone know what it's called and the correct syntax for it's use?
My friends tell me that a special loop exists that isn't a 'while' loop or a 'do while' loop.
Does anyone know what it's called and the correct syntax for it's use?
There's the for
loop, although I don't know how special I'd consider it.
A goto loop perhaps? That is pretty special.
start:
/* do stuff */
if ( !done ) goto start;
There are 3 kind of loops in c
.
The for loop: http://cprogramminglanguage.net/c-for-loop-statement.aspx
for (initialization_expression;loop_condition;increment_expression){
// statements
}
The while loop: http://cprogramminglanguage.net/c-while-loop-statement.aspx
while (expression) {
// statements
}
The do while loop: http://cprogramminglanguage.net/c-do-while-loop-statement.aspx
do {
// statements
} while (expression);
And you can emulate loops with a function ofcourse:
Emulating a do while loop:
void loop(int repetitions){
// statements
if(repetitions != 0){
loop(repetitions - 1);
}
}
Emulating a while loop:
void loop(int repetitions){
if(repetitions != 0){
// statements
loop(repetitions - 1);
}
}
A setjmp loop perhaps? That is pretty special.
static jmp_buf buf;
int i = 0;
if ( setjmp(buf) < end ) {
/* do stuff */
longjmp(buf, i++);
}
and don't forget recursion
void doSomething(int i)
{
if(i > 15)
return;
/* do stuff */
doSomething(i + 1);
}
A signal handler loop perhaps? That is pretty special.
#include <signal.h>
void loop(int signal)
{
if ( !done ) {
/* do stuff */
raise(SIGINT);
}
}
int main() {
signal(SIGINT, loop);
raise(SIGINT);
return 0;
}
A Y combinator loop? That's special enough to be apple only (for now). Also special enough to leak memory all over the place
#include <stdio.h>
#include <Block.h>
typedef void * block;
typedef block (^block_fn)(block);
typedef void (^int_fn)(int);
int main(int argc, char ** argv) {
block_fn Y = ^ block(block f) {
return ((block_fn) ^ block(block_fn x) {
return x(x);
})(^ block(block_fn x) {
return ((block_fn)f)(Block_copy(^ block(block y) {
return ((block_fn)(x(x)))(y);
}));
});
};
int_fn loop = Y(^ block(int_fn f) {
return Block_copy(^ (int a) {
if (a <= 0) {
printf("loop done\n");
} else {
printf("loop %d\n", a);
f(a - 1);
}
});
});
loop(10);
return 0;
}