บทความที่เชื่อมโยงแน่นอนได้รับมันถูกต้องเกี่ยวกับโดนัลด์ของ Knuth N + 2/1 ลูป แสดงเป็น C / C ++ / Java:
for (;;) {
get next element;
if (at the end) break;
process the element;
}
สิ่งนี้มีประโยชน์สำหรับการอ่านบรรทัดหรืออักขระจากไฟล์ทดสอบว่าคุณถึง EOF แล้วทำการประมวลผล ฉันเคยเห็นรูปแบบfor(;;)..if(..)break;
ปรากฏว่ามันเป็นสำนวนให้ฉัน (ก่อนที่ฉันจะอ่านบทความ Knuth ที่พิมพ์ซ้ำในโปรแกรม Literate Programmingหนังสือเล่มนี้เคยเป็น "wtf?")
Knuth แนะนำคำหลักloop/while/repeat
:
loop:
S;
while C:
T;
repeat
ที่ไหนS
และT
เป็นผู้ถือสถานที่สำหรับชุดของคำสั่งเป็นศูนย์หรือมากกว่าและC
เป็นเงื่อนไขบูลีน หากไม่มีS
คำสั่งก็จะเป็นวงในขณะที่และถ้าไม่มีT
คำสั่งแล้วมันจะเป็นวงทำ
โครงสร้างนี้สามารถวางนัยโดยการอนุญาตให้มีwhile C
อนุประโยคเป็นศูนย์หรือมากกว่าทำให้เหมาะสำหรับการแสดงลูปไม่สิ้นสุดและจากนั้นเงื่อนไขที่หายากบางอย่างที่จะต้องใช้การตรวจสอบสองครั้ง
ในบทความเดียวกัน Knuth แนะนำกลไกการส่งสัญญาณที่จะเป็นข้อยกเว้นในการขว้างปา / จับได้ในท้องถิ่น (เป็นทางเลือกแทนการใช้ goto)
สำหรับฉัน? ฉันหวังว่า Java สนับสนุนหางเพิ่มประสิทธิภาพการโทรเพื่อที่ฉันจะแสดงใด ๆโครงสร้างการควบคุมทั่วไปตามความจำเป็น
อัปเดต:ฉันลืมที่จะพูดถึงว่าโปรแกรมเมอร์ C / C ++ / Java จำนวนมากหลีกเลี่ยงปัญหานี้โดยใช้การกำหนดแบบฝังในเงื่อนไขwhile
:
while ((c = getc(f)) != -1) {
T;
}
การใช้คำศัพท์จากโครงสร้างของ Knuth สิ่งนี้สามารถใช้ได้เมื่อS
และC
สามารถรวมกันเป็นนิพจน์เดียวได้ บางคนเกลียดที่จะเห็นการมอบหมายที่ฝังอยู่ด้านบนในขณะที่คนอื่นเกลียดที่จะเห็นbreak
ในfor (;;)
ด้านบน แต่เมื่อใดS
และC
ไม่สามารถรวมกันได้เช่นเมื่อS
มีหลาย statement for (;;)
มันเป็นทางเลือกเดียวโดยไม่ต้องใช้รหัสซ้ำ อีกทางเลือกหนึ่งคือการทำซ้ำS
รหัส:
S;
while (C) {
T;
S;
}
loop/while/repeat
ทางเลือกของ Knuth นั้นดูดีกว่ามาก