Artikel yang ditautkan pasti benar tentang Loop N + 1/2 Donald Knuth . Dinyatakan dalam C / C ++ / Java:
for (;;) {
get next element;
if (at the end) break;
process the element;
}
Ini berguna untuk membaca baris atau karakter dari file, menguji apakah Anda telah mencapai EOF, dan kemudian memprosesnya. Saya sudah terbiasa melihat polanya for(;;)..if(..)break;
muncul sehingga itu idiomatis bagi saya. (Sebelum saya membaca artikel Knuth, dicetak ulang dalam buku Literate Programming , artikel ini dulunya adalah "wtf?".)
Knuth menyarankan kata kunci loop/while/repeat
:
loop:
S;
while C:
T;
repeat
Di mana S
dan T
adalah pemegang tempat untuk serangkaian pernyataan nol atau lebih, dan C
merupakan kondisi boolean. Jika tidak ada S
pernyataan maka itu akan menjadi loop sementara, dan jika tidak ada T
pernyataan maka itu akan menjadi loop lakukan.
Konstruk ini sendiri dapat digeneralisasikan dengan mengizinkan nol atau lebih while C
klausa, membuatnya sempurna untuk mengekspresikan loop tak terbatas dan kemudian beberapa kondisi langka yang membutuhkan dua pemeriksaan.
Dalam artikel yang sama, Knuth menyarankan mekanisme pensinyalan yang akan menjadi versi lokal dari pengecualian melempar / menangkap (sebagai alternatif untuk menggunakan goto).
Untuk saya? Saya berharap Java mendukung pengoptimalan tail-call, sehingga saya dapat mengekspresikan struktur kontrol umum apa pun yang diperlukan.
Pembaruan: Saya lupa menyebutkan bahwa banyak programmer C / C ++ / Java menyiasati yang satu ini dengan menggunakan tugas yang disematkan dalam kondisi while
:
while ((c = getc(f)) != -1) {
T;
}
Menggunakan istilah-istilah dari konstruk Knuth, ini diizinkan kapan S
dan C
dapat digabungkan menjadi satu ekspresi. Beberapa orang benci melihat tugas yang disematkan di atas, sementara yang lain benci melihat yang break
di for (;;)
atas. Tetapi ketika S
dan C
tidak dapat digabungkan, seperti ketika S
memiliki beberapa pernyataan, itu for (;;)
adalah satu-satunya alternatif tanpa kode berulang. Alternatif lain adalah dengan hanya menggandakan S
kode:
S;
while (C) {
T;
S;
}
loop/while/repeat
Alternatif Knuth tampaknya jauh lebih baik.