C dilinde üç ana döngü yapısı vardır: for, while ve do-while. Bunlar, yinelemeli hesaplamaları gerçekleştirme, veri yapılarında dolaşmayı kolaylaştırma ve dizilerin işlenmesini otomatikleştirme ihtiyacından doğmuştur. İlk olarak döngü sözdizimi, erken programlama dillerinde (Algol, Fortran) ortaya çıkmış ve okuyuculuğu ve akış kontrolünü artırmak için C sözdizimine uyarlanmıştır.
Tarihçe
Başlangıçta programcılar, yinelemeli işlemleri düzenlemek için etiketler ve goto kullanıyordu, bu da hızla karmaşık bir koda (spaghetti code) yol açıyordu. Yapısal döngülerin tanıtılması (C dilinde 1972'den itibaren), yineleme ve program mantığının tanımında tek tip bir yaklaşım sağladı.
Sorun
Döngülerin ana görevi, belirli bir işlemin kaç kez tekrarlanacağını ve döngüden çıkışın kontrol edilme şeklinin ne olacağını belirlemektir. Önceden tekrar sayısı biliniyorsa, bedenin en az bir kez çalıştırılması gerekip gerekmediği ve çıkış koşulunun önceden hesaplanıp hesaplanmayacağına bağlı olarak döngü türünü doğru seçmek önemlidir.
Çözüm
Kod örneği:
#include <stdio.h> int main() { int i = 0; // while döngüsünün örneği while (i < 3) { printf("while: %d\n", i); i++; } // for döngüsünün örneği for (int j = 0; j < 3; j++) { printf("for: %d\n", j); } // do-while döngüsünün örneği int k = 0; do { printf("do-while: %d\n", k); k++; } while (k < 3); return 0; }
Anahtar özellikler:
while(1) ile for(;;) arasındaki fark nedir ve sonsuz döngü için hangisini kullanmak daha iyidir?
Yanıt: Her iki seçenek de sonsuz bir döngü oluşturur ve aynı makine koduna dönüştürülür, performans açısından bir fark yoktur. Genellikle for(;;) kullanılır, böylece ne başlangıçtan, ne çıkış koşulundan, ne de adım işleminden beklendiği açıkça gösterilir.
for(;;) { // sonsuz döngü } // veya while(1) { // sonsuz döngü }
for içindeki döngü değişkenini gövde içinde değiştirmek mümkün müdür ve ne olur?
Yanıt: Döngü değişkeninin (örneğin, i++) for döngüsü gövdesinde değiştirilmesi, beklenmeyen bir yineleme sayısına yol açacaktır. Böyle değişiklikler okuyucuları yanıltır ve hata ayıklamayı zorlaştırır.
for (int i = 0; i < 10; i++) { printf("%d\n", i); i += 2; // standart dışı adım değişikliği! }
Döngü gövdesi boş bırakılırsa ne olur? Hangi durumlarda bu mantıklıdır?
Yanıt: Boş döngü gövdesi kabul edilebilir ve bir olayın meydana gelmesini beklemek veya verileri hazırlamak için kullanılabilir:
while(*src++ = *dst++); // null karakterine kadar dize kopyalama
Olumsuz durum
Projede, döngü değişkeninin gövdesi içinde değiştirildiği bir for döngüsü kullanıldı, bu da işlenen öğelerin yanlış sayısı, hatalara ve hata ayıklamada zorluklara yol açtı.
Artılar:
Eksiler:
Olumlu durum
Değiştirmeden sabit bir uzunlukta diziyi dolaşmak için for kullanımı:
Artılar:
Eksiler: