Her Zaman Bir Kez Çalışan Döngü
Bir while döngüsü davranmadan önce test eder, dolayısıyla sıfır kez çalışabilir. Bu genellikle doğrudur. Bazen tam olarak yanlıştır: bir istemi göstermeden onu tekrarlayıp tekrarlamayacağınızı bilemezsiniz ve biraz okumadan kullanıcının girdisini yargılayamazsınız. do-while testi sona taşır, dolayısıyla gövde önce çalışır ve koşul yalnızca tekrar yapılıp yapılmayacağına karar verir.
i < 5 koşulu baştan yanlıştır. while döngüsü sıfır kez çalışır; do-while tam olarak bir kez. Aralarındaki tüm fark budur.
Söz Dizimi ve O Noktalı Virgül
do {
// gövde - her zaman en az bir kez çalışır
} while (koşul);
Sıra, çalıştığı gibi okunur: gövdeyi yap (do), koşul hâlâ geçerli olduğu sürece (while) tekrar yap.
Kapanış parantezinden sonraki noktalı virgül zorunludur. do ... while (kosul); tek bir deyimdir ve C deyimleri noktalı virgülle biter. Onu atlayın, derleyici okumaya devam eder ve sonra aşağıda bir yerde söz dizimi hatası bildirir - asıl hatanın çoğu zaman hatanın gösterdiği satırdan birkaç satır uzakta olmasının sebebi budur.
Bu aynı zamanda C'de noktalı virgüllü while (kosul); yazımının bir hata değil, doğru olduğu tek yerdir. Düz bir while döngüsünde aynı noktalama boş bir gövde ve genellikle bir sonsuz döngü üretir; burada bir do'yu kapatıyordur.
Tek deyimlik bir gövde için süslü parantezler isteğe bağlıdır ama diğer her C denetim yapısında olduğu gibi yine de yazın.
Girdi Doğrulama Kalıbı
do-while bunun için tasarlanmıştı. Kabul edilebilir olup olmadığını anlayabilmeniz için bir şeyi okumanız gerekir, dolayısıyla okuma testten önce gerçekleşmelidir:
Döngü, bir değer geçene dek okumayı sürdürür ve kötü bir değeri reddeden koşulun aynısı, başka bir geçiş isteyendir. Bir while olarak yazıldığında okumanın iki kez görünmesi gerekirdi - bir kez koşulu hazırlamak için döngüden önce, bir kez gövdenin sonunda - ki do-while'ın kaldırdığı yineleme budur.
Gerçek girdiyle gövde yerine scanf çağırırdı:
int age;
do {
printf("Yasinizi girin (1-120): ");
if (scanf("%d", &age) != 1) {
while (getchar() != '\n') { } /* bozuk satiri at */
age = -1; /* bir gecis daha zorla */
}
} while (age < 1 || age > 120);
Satırın geri kalanını boşaltan içteki while'a dikkat edin. scanf dönüştürmeyi başaramazsa, sorunlu metin hâlâ girdi tamponunda durur ve sonraki her okuma da onda başarısız olur - istemi yazdırarak sonsuza dek dönen bir döngü. Onu temizlemek kalıbın bir parçasıdır.
Menü Kalıbı
Diğer klasik kullanım: seçenekleri göster, bir seçim oku, ona göre davran ve kullanıcı çıkana dek tekrarla. Menü, test edilecek bir seçim var olmadan önce görünmelidir.
switch içindeki break, döngüyü değil switch'i bitirir - ikisi de aynı anahtar kelimeyi kullandığı için bu konuda kesin olmaya değer. Burada döngü, choice != 4 yanlış olduğu için biter. Switch'in içinden döngüden çıkmak isteseydiniz, yol return ya da bir bayrak değişkeni olurdu; tek başına break bunu yapamaz.
Garantili İlk Geçiş Bir Hata Olabilir
Gövde herhangi bir testten önce çalıştığı için do-while, var olmayan veriyi memnuniyetle işler:
/* HATA: n sıfır olsa bile a[0]'ı yazdırır */
int i = 0;
do {
printf("%d\n", a[i]);
i++;
} while (i < n);
n == 0 ile bu, boş bir dizide a[0]'ı okur - tanımsız davranış. Boş olabilecek bir koleksiyon üzerindeki her döngü, testi önce gelen bir while ya da for ister.
Pratik kural: do-while'ı yalnızca sıfır yinelemeli bir çalışma problemin doğası gereği imkânsızsa kullanın, yalnızca pratikte pek olası değilse değil. Bir kullanıcıya sormak, bir hedef çıkana dek zar atmak, bir aday üretip test etmek - bunlar gerçekten ilk geçişten önce yargılanamaz. Bir listeyi dolaşmak bu iddiada bulunamaz.
do-while İçinde break ve continue
İkisi de çalışır ve continue'nun bilmeye değer bir püf noktası vardır: gövdenin tepesine değil, koşul testine atlar.
Gövdenin tepesindeki i++, continue'nun kestiği geçişler dahil her geçişte çalışır, dolayısıyla döngü yine ilerler. Güncellemeyi bir continue'dan sonra koyun, döngü takılır - while döngülerindeki tuzağın aynısı.
break döngüden hemen çıkar ve koşulu tamamen atlar.
Üç Döngü Arasında Seçim Yapmak
C'nin üç döngüsü eşit derecede güçlüdür; seçim, niyeti hangisinin ifade ettiğiyle ilgilidir.
for bir sayac, siniri ve adimi bir arada durur - "n kez"
while bir kosul degisene kadar tekrarla, belki hic degil - "kadar"
do-while ayni, ama ilk gecis garantili - "en az bir kez"
Pratikte do-while, üçü arasında açık ara en nadir olanıdır. Çoğu döngü ya sayar ya da boş durumu ele almak zorundadır ve ikisi de testi tepede ister. Bir while döngüsünün koşulunu hazırlamak için hemen ondan önce bir deyimi yinelerken yakalarsanız do-while'a uzanın - o yineleme işaretin ta kendisidir.
Sıkça Sorulan Sorular
C'de do-while döngüsü nasıl yazılır?
do { gövde } while (koşul); - gövde önce gelir, test sonra gelir ve tüm deyim bir noktalı virgülle biter. Gövde her zaman en az bir kez çalışır, sonra koşul sıfırdan farklı olduğu sürece tekrarlanır.
C'de while ile do-while arasındaki fark nedir?
Testin nerede durduğu. Bir while döngüsü koşulu ilk geçişten önce kontrol eder, dolayısıyla sıfır kez çalışabilir. Bir do-while sonradan kontrol eder, dolayısıyla her zaman en az bir kez çalışır. do-while'ı yalnızca o garantili ilk geçiş gerçekten problemin ihtiyacı olduğunda seçin.
do-while döngüsünün sonunda neden noktalı virgül gerekir?
Çünkü do ... while (kosul); tek bir deyimdir ve diğer her C deyimi gibi noktalı virgülle sonlandırılır. Onu atlamak, derleyici deyimin geri kalanını okumaya devam ettiği için sonraki satırı gösteren kafa karıştırıcı bir söz dizimi hatası üretir.
Ne zaman do-while döngüsü kullanmalıyım?
Tekrarlanıp tekrarlanmayacağını bilebilmeniz için gövdenin önce çalışması gerektiğinde: bir seçim okumadan önce menü göstermek, girdi geçerli olana dek yeniden sormak ya da bir değer üretip sonra test etmek. Koşul önceden kontrol edilebiliyorsa bunu bir while döngüsü daha açık söyler.