2013-04-19 17 views
18

Im dostosowuję kod znaleziony przez Internet (jest to pokwitowanie tweetem adafruit). Nie mogę zrozumieć wiele części kodu, ale najbardziej kłopotliwy jest dla mnie dla pętli z dwoma średnikami wewnątrz nawiasówDwa średniki wewnątrz nawiasów do pętli

boolean jsonParse(int depth, byte endChar) { 
    int c, i; 
    boolean readName = true; 

    for(;;) { //<--------- 
    while(isspace(c = timedRead())); // Scan past whitespace 
    if(c < 0) return false; // Timeout 
    if(c == endChar) return true; // EOD 

    if(c == '{') { // Object follows 
     if(!jsonParse(depth + 1, '}')) return false; 
     if(!depth) return true; // End of file 
     if(depth == resultsDepth) { // End of object in results list 

co robi for (;;) oznacza? (Jest to program Ciężki więc to chyba w C)

+7

To jest idiomatyczna pętla "Forever", która śledzi początki książki K & R. – dasblinkenlight

+0

Dla mnie wygląda jak Java, a nie dla C. – Magnilex

+0

Możliwy duplikat pytania [Two Semi Colon Java for Loop] (https://stackoverflow.com/questions/5676992/two-semi-colon-java-for-loop-question) – Archmede

Odpowiedz

46
for(;;) { 
} 

funkcjonalnie oznacza

while (true) { 
} 

Prawdopodobnie przerwania pętli/powrót z pętli na podstawie pewnych warunków wewnątrz ciała pętli.

Powodem że for(;;) pętle na zawsze dlatego for ma trzy części, z których każda jest opcjonalny. Pierwsza część inicjuje pętlę; drugi decyduje, czy kontynuować pętlę, a trzeci robi coś na końcu każdej iteracji. Jest pełna forma, to zazwyczaj zobaczyć coś takiego:

for(i = 0; i < 10; i++) 

Jeśli pierwszy (inicjalizacji) lub od ostatniego (end-of-iteracji) części brakuje, nic się nie dzieje w ich miejsce. Jeśli brakuje części środkowej (testowej), działa ona tak, jakby na jej miejscu znajdował się true. Tak więc for(;;) jest taki sam jak for(;true;) ', który (jak pokazano powyżej) jest taki sam jak while (true).

+0

@Wayne Conrad bardzo dziękuje za edycję, znacznie lepiej. – taocp

+0

"z których każdy jest opcjonalny" myślę, że jest to coś, czego nie uczą na kursie programowania (chociaż widziałem i używałem pętli, które pominęły część iteratora, zawsze się nad tym zastanawiałem). dzięki. to także mój pierwszy raz pytając w stackoverflow i jestem zdumiony szybkością, na którą to pytanie zostało odebrane. jeśli nie masz nic przeciwko, czy możesz mi powiedzieć, dlaczego ktoś zignorował to pytanie? Wiem, że to głupie pytanie, ale myślałem, że to legalne. – osse

2

Pętla for ma 3 komponenty, oddzielone średnikami. Pierwszy komponent działa przed rozpoczęciem pętli i jest powszechnie używany do inicjowania zmiennej. Drugi to warunek. Warunek jest sprawdzany na początku każdej iteracji, a jeśli ma wartość true, wówczas kod w pętli działa. Trzecie komponenty są wykonywane na końcu pętli, zanim rozpocznie się kolejna iteracja (zaczynająca się od sprawdzenia warunków) i często jest używana do zwiększania zmiennej.

W twoim przypadku for(;;) oznacza, że ​​będzie pętla zawsze, ponieważ warunek nie jest obecny. Pętla kończy się, gdy kod return s lub s.

2

Każda klauzula pętli for jest opcjonalna. Więc kiedy są wykluczeni, nadal pętle. for pętle kompilują się w pętle while.

Wynik końcowy staje się sprawdzeniem, aby zainicjować dowolne zmienne, które kończą się po tym, jak nic się nie dzieje, ponieważ jest pusty, sprawdzanie warunku logicznego w drugim punkcie, który nie występuje, aby pętla się rozpoczęła, a po trafieniu pętli końcowy nawias, sprawdź, czy jest jakiś kod do uruchomienia przed ponownym sprawdzeniem stanu boolowskiego.

W kodzie wygląda:

while(true){ 

} 
2

Oto co Wikipedia Says O tym

Zastosowanie jako nieskończone pętle
Ta C-styl dla pętli jest często źródłem nieskończona pętla, ponieważ podstawowe etapy iteracji są całkowicie kontrolowane przez programistę.W rzeczywistości, kiedy nieskończone pętle przeznaczone tego typu dla pętli mogą być stosowane (pustymi wyrażenia), takie jak:

for (;;)
//loop body

Ten styl jest używany zamiast nieskończonych while(1) pętli uniknąć ostrzeżenie o konwersji typów w niektórych kompilatorach C/C++. Niektórzy programiści preferują bardziej zwięzłą formę o kodzie for(;;) w semantycznie równoważnym, ale bardziej szczegółowym formularzu: while (true).

Powiązane problemy