2012-01-02 10 views
10

Natknąłem sytuacji, jak to kilka razy:Co się dzieje, gdy umieszcza się średnik po stanie pętli while?

while (true) { 

while (age == 5); //What does this semi-colon indicate? 
//Code 
//Code 
//Code 

} 

while(true) wskazuje, że jest to pętla nieskończona, ale mam problemy ze zrozumieniem tego, co średnik po warunkiem while realizuje, nieprawdaż T to równoznaczne z tym ?:

while (age == 5) { } 

//Code 
//Code 

innymi słowy, to znaczy, że pętla while jest bezużyteczny, ponieważ nigdy nie wchodzi do bloku?

+2

Pytasz o C lub C#? Zaznaczyłeś pytanie tym razem. – Oded

+0

Mam pojęcia ... logicznie nic nie zrobię – craig1231

+0

Widziałem, jak to się zdarza w obu, czy zachowuje się inaczej w obu językach? –

Odpowiedz

22
while (age == 5);  // empty statement 

jest równoważna

while (age == 5) { } // empty block 

Aktualizacja: Nawet jeśli nie ma ciała do wykonania, nie oznacza, że ​​pętla kończy. Zamiast tego po prostu zapętli się wielokrotnie po warunkowym (, który może mieć lub polegać na efektach ubocznych), dopóki nie zostanie spełniony. Oto odpowiednik forma z goto:

loop: 
if (age == 5) 
    goto loop; 

Ta konstrukcja jest czasami stosowany jako busy-loop czeka na flagę, aby zmienić w kodzie gwintowany. (Dokładne zastosowanie i ważność zmienia się sporo po języku, algorytmu i środowiska wykonawczego.)

znaleźć zastosowanie ; za „pusty bloku” pustym stwierdzeniem wątpliwa konstrukt do korzystania powodu problemów tak:

while (age == 5); { 
    Console.WriteLine("I hate debugging"); 
} 

(widziałem ten błąd kilka razy wcześniej, kiedy został dodany nowy kod.)

Szczęśliwy kodowania.

+0

Tak właśnie myślałem - co mnie myli, to to, że widziałem to wiele razy, aby zilustrować wielowątkowe problemy z synchronizacją. Wątpię, że to pomyłka, ponieważ to się powtórzyło. –

+0

@Sean To odpowiednik składni. Przypuszczalnie "wiek" jest ("zmienny" i) ustawiony przez inny wątek - więc niekoniecznie "pomyłka" jest używanie tego idiomu (ale argumentuję przeciwko konkretnej konstrukcji). –

+0

Czytałem gdzieś, że kompilator może zoptymalizować nieskończone pętle takie jak to; pozwól mi zobaczyć, czy mogę znaleźć, gdzie czytam to ... –

1

utknął w nieskończonej pętli. W c ; jest terminatorem o wartości NULL. Kompilator zakłada, że ​​powyższa pętla ma tylko jedną instrukcję, która jest ;, co powoduje, że pętla jest powtarzana w nieskończoność.

1

oświadczenie składające się tylko

;

jest zerowy rachunek. Jest to to samo, co blok (zwany również instrukcją złożoną) z niczym wewnątrz i nie zawiera żadnych elementów. Oba nie wykonują żadnych operacji.

0

Jeśli umieścimy ; w dowolnym miejscu, oznacza to oświadczenie null (oświadczenie, które nie robi nic).

Kiedy piszemy

while(true); 

Oznacza to pętlę natomiast oświadczenie, że nic nie robi.Jest ona podobna do

while(true) 
i++; 

Oto oświadczenie nie jest null ale w poprzednim oświadczeniu sprawa została null.

Powiązane problemy