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 Sdan Tadalah pemegang tempat untuk serangkaian pernyataan nol atau lebih, dan Cmerupakan kondisi boolean. Jika tidak ada Spernyataan maka itu akan menjadi loop sementara, dan jika tidak ada Tpernyataan maka itu akan menjadi loop lakukan.
Konstruk ini sendiri dapat digeneralisasikan dengan mengizinkan nol atau lebih while Cklausa, 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 Sdan Cdapat digabungkan menjadi satu ekspresi. Beberapa orang benci melihat tugas yang disematkan di atas, sementara yang lain benci melihat yang breakdi for (;;)atas. Tetapi ketika Sdan Ctidak dapat digabungkan, seperti ketika Smemiliki beberapa pernyataan, itu for (;;)adalah satu-satunya alternatif tanpa kode berulang. Alternatif lain adalah dengan hanya menggandakan Skode:
S;
while (C) {
T;
S;
}
loop/while/repeatAlternatif Knuth tampaknya jauh lebih baik.