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 S
ve T
sıfır veya daha fazla ifade dizisi için yer tutucular ve C
bir boolean koşuludur. Bir S
ifade olmasaydı, bir while döngüsü olurdu ve herhangi bir T
ifade yoksa o zaman bir do döngüsü olurdu.
Bu yapının kendisi, sıfır veya daha fazla while C
cü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 S
ve C
birleştirilebilir. Başkalarının görmesini istemem Bazı insanlar, yukarıda gömülü atama görmekten nefret break
içinde for (;;)
yukarıda. Ancak ne zaman S
ve C
birleştirilemedi, örneğin S
birden fazla ifadeye sahip olduğunda , for (;;)
kodu tekrar etmeden tek alternatif budur. Diğer alternatif, S
kodu çoğaltmaktır :
S;
while (C) {
T;
S;
}
Knuth'un loop/while/repeat
alternatifi çok daha iyi görünüyor.