Петля в C поможет! - PullRequest
       5

Петля в C поможет!

0 голосов
/ 13 августа 2010

Мои друзья говорят мне, что существует специальный цикл, который не является циклом while или циклом do while.

Кто-нибудь знает, как он называется и каков правильный синтаксис его использования?

Ответы [ 11 ]

16 голосов
/ 13 августа 2010

А для цикла может быть?

for (i = 0; i < 15; ++i) {
  /* do stuff */
}
10 голосов
/ 13 августа 2010

В c.

имеется 3 вида циклов: цикл for: http://cprogramminglanguage.net/c-for-loop-statement.aspx

for (initialization_expression;loop_condition;increment_expression){
  // statements
}

Цикл while: http://cprogramminglanguage.net/c-while-loop-statement.aspx

while (expression) {
  // statements
}

Цикл do while: http://cprogramminglanguage.net/c-do-while-loop-statement.aspx

do {
  // statements
} while (expression);

И вы можете эмулировать циклы с помощью функции конечно:

Эмуляция цикла do while:

void loop(int repetitions){
    // statements
    if(repetitions != 0){
        loop(repetitions - 1);
    }
}

Эмуляция цикла while:

void loop(int repetitions){
    if(repetitions != 0){
        // statements
        loop(repetitions - 1);
    }
}
10 голосов
/ 13 августа 2010

Возможно, цикл goto? Это довольно особенное.

start:
       /* do stuff */
       if ( !done ) goto start;
9 голосов
/ 13 августа 2010

Возможно, цикл обработки сигналов?Это довольно особенное.

#include <signal.h>

void loop(int signal)
{
    if ( !done ) {
        /* do stuff */
        raise(SIGINT);
    }
}

int main() {
    signal(SIGINT, loop);
    raise(SIGINT);
    return 0;
}
7 голосов
/ 13 августа 2010

Возможно, цикл setjmp? Это довольно особенное.

static jmp_buf buf;

int i = 0;
if ( setjmp(buf) < end ) {
    /* do stuff */
    longjmp(buf, i++);
} 
6 голосов
/ 13 августа 2010

Есть цикл for, хотя я не знаю, как особый Я бы рассмотрел его.

2 голосов
/ 13 августа 2010

и не забудьте рекурсию

void doSomething(int i)
{
    if(i > 15)
        return;
    /* do stuff */
    doSomething(i + 1);
}
0 голосов
/ 13 августа 2010

A Y комбинатор петля? Это достаточно особенное, чтобы быть только яблоком (пока). Также достаточно особенный для утечки памяти повсюду

#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;
}
0 голосов
/ 13 августа 2010

бесконечный цикл?

for (;;) {}

Мне нравится этот: -)

0 голосов
/ 13 августа 2010

Мой ответ здесь может помочь вам понять, как C для цикла работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...