Bağlantılı makale kesinlikle Donald Knuth'un N + 1/2 Döngüler hakkında doğru anlıyor . C / C ++ / Java ile ifade edilmiştir:
for (;;) {
get next element;
if (at the end) break;
process the element;
}
Bu, bir dosyadan satır veya karakter okumak, EOF'a ulaşıp ulaşmadığınızı test etmek ve daha sonra işlemek için kullanışlıdır. for(;;)..if(..)break;Desenin benim için deyimsel olduğunu görmeye çok alışkınım . ( Okuryazar Programlama kitabında yeniden basılmış olan Knuth makalesini okumadan önce , bu "wtf?" İdi.)
Knuth şu anahtar kelimeleri önerdi loop/while/repeat:
loop:
S;
while C:
T;
repeat
Nerede Sve Tsıfır veya daha fazla ifade dizisi için yer tutucular ve Cbir boolean koşuludur. Bir Sifade olmasaydı, bir while döngüsü olurdu ve herhangi bir Tifade yoksa o zaman bir do döngüsü olurdu.
Bu yapının kendisi, sıfır veya daha fazla while Ccümleye izin vererek genelleştirilebilir, böylece sonsuz döngüler ve daha sonra iki kontrole ihtiyaç duyan daha nadir koşullar ifade etmek için mükemmel hale getirilebilir .
Aynı makalede Knuth, istisnaların fırlatılması / yakalanması için yerel bir versiyon olacak bir işaret mekanizması önerdi (goto kullanımına alternatif olarak).
Benim için? Java'nın desteklediği kuyruk çağrısı optimizasyonunu diliyorum, böylece herhangi bir genel kontrol yapısını gerektiği gibi ifade edebilirim .
Güncelleme: Birçok C / C ++ / Java programcısının şu durumlarda gömülü bir atama kullanarak bu sorunu aştığını belirtmeyi unuttum while:
while ((c = getc(f)) != -1) {
T;
}
Knuth'un yapısından gelen terimler kullanılarak, bu, tek bir ifadede birleştirilebilir Sve Cbirleştirilebilir. Başkalarının görmesini istemem Bazı insanlar, yukarıda gömülü atama görmekten nefret breakiçinde for (;;)yukarıda. Ancak ne zaman Sve Cbirleştirilemedi, örneğin Sbirden fazla ifadeye sahip olduğunda , for (;;)kodu tekrar etmeden tek alternatif budur. Diğer alternatif, Skodu çoğaltmaktır :
S;
while (C) {
T;
S;
}
Knuth'un loop/while/repeatalternatifi çok daha iyi görünüyor.