เหตุใดฉันจึงเห็นโครงสร้าง (;;) มากมาย [ปิด]


14

สำหรับวิธีคิดของฉัน a สำหรับลูปถูกใช้เพื่อวนซ้ำในช่วงที่รู้จักหรือกำหนดได้

String[] names = //something;
for ( int i = 0; i < names.length; i++ ) { //do stuff }

ซึ่งเทียบเท่า (การกำหนดขอบเขตของฉันออกไป) เพื่อ:

String[] names = //something;
int i = 0;
while (i < names.length )
{
   // do stuff
   i++;
}

ในคำอื่น ๆ ที่forห่วงเป็นเพียง (มีประโยชน์อย่างมาก) สำหรับน้ำตาลประโยคที่ใช้กันทั่วไปwhileสร้าง

อย่างไรก็ตามฉันเห็นโครงสร้างจำนวนมากfor(;;)บนเว็บซึ่งเทียบเท่ากับการใช้งานจริงwhile(true)

อะไรคือเหตุผลสำหรับสิ่งนี้? เหตุใดจึงไม่มีที่สิ้นสุดสำหรับลูปที่ต้องการมากกว่าอนันต์ขณะที่ลูป

// ฉันยังเห็นหนังสือเรียนภาษาจาวาที่ไม่ได้ใช้งานในขณะที่ลูปเลย! นำไปสู่โครงสร้างมหึมาเช่น:

String input = getInput();
for( ; !inputIsValid(input) ; )
{
   //redo;
}

เหตุผลหลักคือการตั้งค่า การอ่านควรเข้ามาเล่นเมื่อทำการเลือกอย่างไรก็ตาม YMMV
Aaron McIver

ทำไมทุกคนถึงชอบโครงสร้างที่น่าอึดอัดใจ?
Chris Cudmore

10
คุณสามารถสลับwhileและforที่นี่และคำถามจะไม่เปลี่ยนแปลง while(true)และfor(;;)หมายถึงสิ่งเดียวกัน คุณเห็นได้ชัดว่ามีการตั้งค่าที่แข็งแกร่งสำหรับwhileคนอื่น ๆ forอาจจะมีการตั้งค่าที่แข็งแกร่งเท่าเทียมกันสำหรับ เป็นไปไม่ได้ที่จะบอกว่ามีความถูกต้องมากกว่าอีกอัน
Caleb

3
@chris ฉันไม่for(;;)สับสนเลย มันเป็นสำนวน C มาตรฐานซึ่งคุณจะบันทึกไว้ในส่วน 3.5 ของ K&R (2e) ฉันเข้าใจว่าคุณไม่ชอบมัน คุณควรเข้าใจว่าคนอื่นชอบมันอย่างชัดเจน (มิฉะนั้นคุณจะไม่เห็นมัน) มันอาจจะเป็นที่ยอมรับมากขึ้นหรือน้อยลงในภาษาอื่นที่ไม่ใช่ C; คุณได้ติดแท็กผู้ไม่เชื่อเรื่องภาษานี้ซึ่งจะลดความน่าจะเป็นของคำตอบที่ชัดเจน อีกครั้งฉันโหวตให้ปิดเพราะ Q ไม่สร้างสรรค์ หากฉันไม่พอใจฉันจะถูกตั้งค่าสถานะว่าเป็นการโจมตีแทนหรือเพิ่มเติมจากการปิด นั้นคือทั้งหมด.
Caleb

1
โดยส่วนตัวฉันคิดว่ามีโอกาสจริงที่นี่ที่จะมีwheeeeeeee { ... }
ซินแทก

คำตอบ:


33

มันเป็นการหยุดยั้งจากการเขียนโปรแกรมแบบเก่าใน PDP-11 (ใช่ฉันพูดว่าเก่า ) มันใช้เพื่อบันทึกคำสั่งเดียวซึ่งมีประโยชน์สำหรับการทำให้ลูปทำงานได้เร็วขึ้น

ดูข้อมูลเพิ่มเติมต่อไปนี้: http://www.flounder.com/exceptions.htm


3
นั่นคือสิ่งที่ฉันกำลังมองหา มีเหตุผลที่แท้จริงและถูกต้องตามกฎหมาย แต่ไม่สามารถใช้งานได้อีกต่อไป
Chris Cudmore

1
@chris Nnnope คอมไพเลอร์สมัยใหม่บางครั้งจะบ่นเกี่ยวกับการใช้ค่าคงที่ในสภาพของลูป มันไม่ใช่การหลงเหลือเพียงอย่างเดียว
Izkata

มีมากไปกว่านั้น ฉันจำได้ว่าเขียน C ในต้นปี 1990 บนระบบยูนิกซ์และในขณะที่ (จริง) {} ไม่ใช่ตัวเลือก ไม่มีประเภทบูลีนมาตรฐาน แต่หลายระบบยูนิกซ์ที่กำหนดไว้ใน C header files จากหน่วยความจำอย่างน้อยหนึ่งผู้ขายยูนิกซ์กำหนด TRUE เป็นศูนย์ supposidly เพื่อช่วยในการประมวลผลการทำงานของฟังก์ชั่นการประชุมคือการกลับศูนย์ในความสำเร็จและจำนวนบวกเป็นความล้มเหลว นี่หมายความว่าในขณะที่ (TRUE) {} ไม่สามารถพกพาได้
Michael Shaw

1
ฉันไม่สามารถหาได้ในขณะนี้ แต่ฉันสามารถสาบานได้ว่าไม่กี่ปีที่ผ่านมา Dennis Ritchie เขียนโพสต์ใน Usenet โดยระบุว่าสิ่งนี้เป็นเรื่องที่ผิดและเขา / พวกเขาใช้for(;;)ไวยากรณ์เป็น (ตามความเห็น) เจตนาว่าไม่มีเกณฑ์ที่ระบุไว้สำหรับการออกจากลูป
Jerry Coffin

@Polemmy: แน่นอนคุณสามารถเขียนwhile(1) { }ได้
Ed S.

10

คอมไพเลอร์บางตัวจะให้คำเตือน (บางอย่างเช่นนิพจน์เงื่อนไขนั้นคงที่ ) เมื่อใช้while( 1 )แต่for( ; ; )ไม่มีอะไรเตือน โปรแกรมเมอร์ต้องการโค้ดโดยไม่มีคำเตือนดังนั้นพวกเขาจึงใช้สำหรับตัวแปร


บางสิ่งที่คอมไพเลอร์เตือนว่าถูกต้องสมบูรณ์แม้ว่าและ (ในบางกรณี) ก็หลีกเลี่ยงไม่ได้ ดังนั้นพวกเราบางคนปฏิบัติต่อคำเตือนเหมือนกันกับคำเตือน หากคุณเพิกเฉยต่อสิ่งเหล่านี้แน่นอนว่าคุณสามารถล้นพ้นในสิ่งที่ถูกสาปแช่งและไม่เห็นสิ่งสำคัญ - แต่มีประโยชน์และตัวเลือกในการปิดการเตือนทั้งในระดับท้องถิ่นและระดับโลก โดยทั่วไปใช่ดีกว่าที่จะไม่มีคำเตือน แต่ฉันมักจะต้องมีเหตุผลที่แข็งแกร่งกว่านั้นเพื่อใช้สไตล์โค้ดที่แย่ลง ที่นี่มันไม่ได้เลวร้ายเพียงแค่แตกต่างกัน แต่ลูป "ไม่มีที่สิ้นสุด" เป็นของหายาก (หรือสไตล์ที่แย่มาก)
Steve314

5

มันเป็นนิสัยที่ได้มาจากการเขียนโปรแกรม C ซึ่งไม่มีประเภทบูลีน ในขณะที่ (1) อาจเทียบเท่า แต่ For (;;) มักจะใช้ตามที่ปรากฏใน K&R ถ้าฉันจำได้อย่างถูกต้อง ฉันสงสัยว่ามีเหตุผลด้านฮาร์ดแวร์เช่นกัน


4
... สงสัยว่ามีเป็นเหตุผลฮาร์ดแวร์ ...
แอรอน McIver

2
ดังที่เอ็ดเวิร์ดโรเบิร์ตสันสันกล่าวถึงเหตุผลเนื่องจากคอมไพเลอร์ C บน PDP-11 ไม่ทราบว่าความจริงใน "ในขณะที่ (จริง)" เป็นค่าคงที่เวลารวบรวมและจะเพิ่มคำสั่งพิเศษ (การเปรียบเทียบ) เมื่อสร้างชุดประกอบ เนื่องจากทรัพยากรที่ จำกัด มีอยู่ใน PDP-11 โปรแกรมเมอร์จึงใช้การวนรอบเพื่อปรับคำสั่งพิเศษนั้นให้เหมาะสมที่สุดจากโปรแกรม
Jetti

3

สำหรับ (;;) สามารถอ่านได้ว่า "ถาวร" ซึ่งบางคนพบว่าเป็นธรรมชาติมากกว่า "ในขณะที่เป็นจริง"


แม้ว่านี่จะไม่ใช่เหตุผลดั้งเดิม แต่เป็นเหตุผลรองที่ทำให้การตั้งค่าค้างนานหลังจากเหตุผลดั้งเดิมล้าสมัย มันยากมากที่จะตัดหลักฐานใด ๆ เพื่อสนับสนุนสิ่งนี้แม้ว่าจะขอโปรแกรมเมอร์ที่มีประสบการณ์มานาน
DarenW

-2

ทั้งหมดโปรแกรมเมอร์ที่มีประสบการณ์ที่ผมได้ถามสามารถรับรู้for(;;)ได้อย่างรวดเร็วกว่าหรือwhile(true)while(1)


2
โปรแกรมเมอร์ทุกคนที่มีค่าควรจะรับรู้ทั้งสามทันที ทั้งสามเป็นเรื่องธรรมดามากพอที่ทุกคนที่ใช้เวลาอ่านโค้ดเกิน 5 นาทีได้เห็นกันหลายครั้ง
cHao

1
การศึกษาพบว่าโปรแกรมเมอร์ที่มีประสบการณ์สามารถเข้าใจfor(;;)ได้เร็วกว่าwhile(1):-) 14 มิลลิวินาที
วินไคลน์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.