Mengapa saya melihat begitu banyak untuk konstruksi (;;)? [Tutup]

14

Menurut cara berpikir saya, for for loop digunakan untuk beralih pada rentang yang diketahui atau ditentukan.

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

yang setara (pelingkupan i samping) untuk:

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

Dengan kata lain, forloop hanyalah gula sintaksis (sangat berguna) untuk whilekonstruksi yang umum digunakan .

Namun, saya melihat banyak for(;;)konstruksi di web yang secara fungsional setara denganwhile(true)

Apa alasannya? Mengapa infinite for loop lebih disukai daripada loop infinite while?

// Aku bahkan melihat buku teks java yang tidak digunakan saat loop sama sekali! Menuju ke konstruksi mengerikan seperti:

String input = getInput();
for( ; !inputIsValid(input) ; )
{
   //redo;
}
Chris Cudmore
sumber
Alasan utamanya adalah preferensi. Keterbacaan harus mulai berperan saat menentukan pilihan YMMV.
Aaron McIver
Mengapa ada yang lebih suka konstruksi canggung?
Chris Cudmore
10
Anda bisa bertukar whiledan di forsini dan pertanyaannya tidak akan berubah. while(true)dan for(;;)berarti hal yang sama. Anda jelas memiliki preferensi yang kuat untuk while, orang lain mungkin memiliki preferensi yang sama kuatnya untuk for. Tidak mungkin mengatakan bahwa yang satu lebih benar daripada yang lain.
Caleb
3
@ Chris, saya tidak merasa for(;;)membingungkan sama sekali. Ini adalah idiom C standar, yang akan Anda dokumentasikan di bagian 3.5 dari K&R (2e). Saya mengerti bahwa Anda tidak menyukainya; Anda harus memahami bahwa orang lain jelas menyukainya (jika tidak, Anda tidak akan pernah melihatnya). Mungkin lebih atau kurang dapat diterima dalam bahasa selain C; Anda telah menandai agnostik bahasa ini yang hanya mengurangi kemungkinan jawaban definitif. Sekali lagi, saya memilih untuk menutup karena Q tidak konstruktif; jika saya tersinggung saya akan ditandai sebagai ofensif alih-alih atau sebagai tambahan untuk menutup. Itu semuanya.
Caleb
1
Secara pribadi saya pikir ada peluang nyata di sini untuk memiliki sintaks lain sepenuhnya untuk loop tak terbatas: sesuatu sepertiwheeeeeeee { ... }
detly

Jawaban:

33

Ini adalah peninggalan dari praktik pemrograman lama pada PDP-11 (ya, kataku lama ). Ini digunakan untuk menyimpan satu instruksi, yang berguna untuk membuat loop berjalan lebih cepat.

Lihat yang berikut untuk informasi tambahan: http://www.flounder.com/exceptions.htm

Edward Robertson
sumber
3
Itulah tepatnya yang saya cari. Ada alasan yang nyata dan sah, tetapi itu tidak berlaku lagi.
Chris Cudmore
1
@ Chris Nnnope, kompiler modern kadang-kadang akan mengeluh tentang penggunaan konstanta dalam kondisi loop. Ini bukan murni peninggalan.
Izkata
Ada lebih dari itu. Saya ingat menulis C pada awal 1990-an di sistem unix dan sementara (benar) {} bukan pilihan. Tidak ada tipe boolean standar, tetapi beberapa sistem unix mendefinisikannya sendiri dalam file header C. Dari memori, setidaknya satu vendor unix mendefinisikan TRUE sebagai nol seandainya untuk membantu memproses pengembalian fungsi karena konvensi akan mengembalikan nol pada kesuksesan, dan angka positif adalah kegagalan. Ini memang berarti bahwa sementara (TRUE) {} tidak portabel.
Michael Shaw
1
Saya tidak dapat menemukannya sekarang, tetapi saya dapat bersumpah bahwa beberapa tahun yang lalu Dennis Ritchie menulis posting di Usenet yang menyatakan bahwa ini salah, dan dia / mereka menggunakan for(;;)sintaksis sebagai (menurut mereka) pernyataan yang lebih langsung dari maksud bahwa tidak ada kriteria yang dinyatakan untuk keluar dari loop.
Jerry Coffin
@ Poltemy: Yah, Anda tentu bisa menulis while(1) { }.
Ed S.
10

beberapa kompiler akan memberikan peringatan (sesuatu seperti ekspresi kondisional konstan ) ketika menggunakan while( 1 )tetapi dengan for( ; ; )tidak ada yang perlu diperingatkan. Programmer menginginkan kode tanpa peringatan, jadi mereka menggunakan varian for.

stijn
sumber
Beberapa hal yang diperingatkan oleh kompiler adalah benar-benar valid, dan bahkan (dalam beberapa kasus khusus) tidak dapat dihindari. Jadi, sebagian dari kita memperlakukan peringatan sebagai peringatan. Jika Anda mengabaikannya, tentu saja Anda bisa dibanjiri hal-hal terkutuk dan tidak melihat yang penting - tetapi ada pragma dan opsi untuk menonaktifkan peringatan, secara lokal atau global. Pada dasarnya, ya lebih baik tidak memiliki peringatan, tetapi saya biasanya membutuhkan alasan yang lebih kuat daripada itu untuk mengadopsi gaya kode yang lebih buruk. Di sini tidak lebih buruk hanya berbeda, tetapi loop "tak terbatas" jarang terjadi (atau gaya yang sangat buruk).
Steve314
5

Ini adalah kebiasaan yang diperoleh dari pemrograman C di mana tidak ada tipe boolean. Sementara (1) akan berpotensi setara tetapi Untuk (;;) sering digunakan seperti yang muncul di K&R jika saya ingat dengan benar. Saya menduga ada alasan perangkat keras di sana juga.

Insinyur Dunia
sumber
4
... menduga ada adalah alasan hardware ...
Aaron McIver
2
Seperti yang disebutkan Edward Robertson, alasannya adalah karena kompiler C pada PDP-11 tidak menyadari bahwa yang benar dalam "while (true)" adalah konstanta waktu kompilasi dan akan menambah instruksi tambahan (pembanding) ketika menghasilkan perakitan. Karena sumber daya terbatas yang tersedia pada PDP-11, programmer menggunakan loop for untuk mengoptimalkan satu instruksi tambahan dari program.
Jetti
3

untuk (;;) dapat dibaca sebagai "selamanya" yang beberapa orang temukan lebih alami daripada "sementara benar".

Oskar N.
sumber
Meskipun ini bukan alasan asli, itu adalah alasan sekunder mengapa preferensi macet lama setelah alasan asli menjadi usang. Sangat sulit untuk mengeluarkan bukti apa pun untuk mendukung ini, selain bertanya pada programmer yang sudah lama berpengalaman.
DarenW
-2

Semua programmer berpengalaman yang saya minta dapat mengenali for(;;)lebih cepat daripada while(true)atau while(1).

kevin cline
sumber
2
Setiap programmer yang sangat berharga harus bisa mengenali ketiganya secara instan. Ketiganya cukup umum sehingga siapa pun yang menghabiskan lebih dari 5 menit membaca kode telah melihat mereka masing-masing beberapa kali.
cHao
1
Penelitian telah menunjukkan bahwa pemrogram berpengalaman dapat memahami 14 for(;;)ms lebih cepat dari while(1):-)
kevin cline