Kembali ke hari-hari C / C ++ saya, mengkodekan "loop tak terbatas" sebagai
while (true)
terasa lebih alami dan tampak lebih jelas bagi saya daripada sebaliknya
for (;;)
Pertemuan dengan PC-lint di akhir 1980-an dan diskusi praktik terbaik berikutnya menghentikan kebiasaan ini. Saya telah mengkodekan loop menggunakan for
pernyataan kontrol. Hari ini, untuk pertama kalinya dalam waktu yang lama, dan mungkin kebutuhan pertama saya untuk loop tak terbatas sebagai pengembang C #, saya menghadapi situasi yang sama. Apakah salah satunya benar dan yang lainnya tidak?
c#
infinite-loop
Bob Kaufman
sumber
sumber
while(true)
membutuhkan suatu kondisi.for(;;)
Oleh karena itu, representasi yang lebih baik untuk loop tak terbatas yang berulang tanpa syarat. 2. Kompiler lama yang tidak dioptimalkan mungkin sebenarnya telah mengevaluasi(true)
saat ini berulang. 3. C adalah bahasa minimalis dari zaman teletipe, 300 terminal baud, dan nama variabel 1-char. Dalam lingkungan di mana setiap pukulan kunci dihitung,for(;;)
cukup sedikit lebih pendek dariwhile(true)
.Jawaban:
Selalu apa yang saya gunakan dan apa yang saya lihat orang lain gunakan untuk loop yang harus diputus secara manual.
sumber
Kompilator C # akan mengubah keduanya
dan
ke
CIL untuk keduanya sama. Kebanyakan orang merasa
while(true)
lebih mudah dibaca dan dipahami.for(;;)
agak samar.Sumber:
Saya mengacaukan sedikit lebih banyak dengan .NET Reflector , dan saya mengkompilasi kedua loop dengan "Optimize Code" di Visual Studio.
Kedua loop dikompilasi menjadi (dengan .NET Reflector):
Raptor harus segera menyerang.
sumber
goto
pernyataan, btw, yang tidak mengherankan.goto LOOP
adalah C # infinite loop yang benar :)Saya pikir ini mungkin lebih mudah dibaca dan jelas merupakan standar untuk digunakan di C #:
sumber
while(1)
tidak valid di C #, karena1
bukan abool
.Terengah-engah, gunakan:
ATAU seperti yang ditunjukkan jsight , Anda mungkin ingin lebih yakin:
Sebelum orang meneriaki saya, itu semua kode CIL yang sama, saya memeriksa :)
sumber
Untuk mengulangi beberapa lelucon lama:
for (;;) {}
" - itu membuat pernyataan itu menangis.#define EVER ;;
".sumber
#define ever (;;)
yang menurut saya lebih mudah dibaca.for ever {}
#define forever while(true)
Jika Anda ingin sekolah tua, goto masih didukung di C #:
Untuk loop yang benar-benar tak terbatas, ini adalah perintah masuk ke. =)
sumber
Saya pikir
while (true)
ini sedikit lebih mudah dibaca.sumber
Dalam situasi di mana saya membutuhkan loop tak terbatas yang sebenarnya, saya selalu menggunakannya
Tampaknya mengekspresikan maksud lebih baik daripada pernyataan kosong untuk.
sumber
Secara pribadi, saya selalu lebih suka
for(;;)
justru karena tidak ada syaratnya (berlawanan denganwhile (true)
yang selalu benar). Namun, ini benar-benar poin gaya yang sangat kecil, yang menurut saya tidak pantas untuk diperdebatkan. Saya belum melihat pedoman gaya C # yang mengamanatkan atau melarang pendekatan mana pun.sumber
while
". Sejauh menyangkut pemrogram, kompilator mengubah kode tingkat tinggi menjadi IL. Tidak adawhile
(ataufor
) loop di IL, hanya label dan gotos.Saya pribadi lebih suka
for (;;)
idiom (berasal dari sudut pandang C / C ++). Meskipun saya setuju bahwa thewhile (true)
lebih mudah dibaca dalam arti tertentu (dan itulah yang saya gunakan kembali ketika bahkan di C / C ++), saya telah beralih menggunakanfor
idiom karena:Saya pikir fakta bahwa loop tidak berhenti (dengan cara normal) layak untuk 'dipanggil', dan saya pikir itu
for (;;)
melakukan ini sedikit lebih.sumber
for
menjadiwhile
. Untuk keduanyafor (;;){}
danwhile (true){}
, itu menghasilkanwhile(true){}
kode baru . Lihat jawaban ini .Asli K & R buku untuk C, dari mana C # dapat melacak nenek moyang nya, dianjurkan
untuk loop tak terbatas. Ini tidak ambigu, mudah dibaca, dan memiliki sejarah panjang dan mulia di baliknya.
Addendum (Feb 2017)
Tentu saja, jika menurut Anda formulir perulangan ini (atau bentuk lainnya) terlalu samar, Anda selalu dapat menambahkan komentar .
Atau:
sumber
Seharusnya
while(true)
tidakwhile(1)
, jadiwhile(1)
salah di C #, yes;)sumber
Atau, orang dapat mengatakan memiliki loop tak terbatas biasanya merupakan praktik yang buruk, karena ia memerlukan kondisi keluar kecuali jika aplikasi benar-benar berjalan selamanya. Namun, jika ini untuk rudal jelajah saya akan menerima kondisi keluar eksplisit mungkin tidak diperlukan.
Padahal saya suka yang ini:
sumber
f < 16777217f
selalufalse
... jadi ini tidak pernah berulang.Saya lebih suka kode yang sedikit lebih "melek". Saya lebih cenderung melakukan hal seperti ini dalam praktiknya:
sumber
do ... while()
lingkaran terselubung. Saya hanya butuh beberapa detik untuk melihatnya. Seandainya Anda menulis satudo ... while()
lingkaran, itu akan segera menjadi jelas. -1break
.Bahkan saya juga mengatakan yang di bawah ini lebih baik :)
sumber
Jika Anda sedang bermain kode golf, saya sarankan
for(;;)
. Di luar itu,while(true)
memiliki arti yang sama dan terkesan lebih intuitif. Bagaimanapun, sebagian besar pembuat kode kemungkinan akan memahami kedua variasi, jadi itu tidak terlalu penting. Gunakan apa yang paling nyaman.sumber
Satu-satunya alasan yang saya katakan
for(;;)
adalah karena keterbatasan CodeDom (sementara loop tidak dapat dideklarasikan menggunakan CodeDom dan for loop dilihat sebagai bentuk yang lebih umum sebagai loop iterasi).Ini adalah alasan yang cukup longgar untuk memilih ini selain fakta bahwa
for
implementasi loop dapat digunakan untuk kode normal dan kode yang dihasilkan CodeDom. Artinya, bisa lebih standar.Sebagai catatan, Anda dapat menggunakan cuplikan kode untuk membuat
while
loop, tetapi keseluruhan loop harus berupa cuplikan ...sumber
Keduanya memiliki fungsi yang sama, tetapi orang pada umumnya lebih suka
while(true)
. Rasanya mudah dibaca dan dimengerti ...sumber
Setiap ekspresi yang selalu mengembalikan nilai true harus OK untuk while loop.
Contoh:
sumber
Dalam hal keterbacaan kode
while(true)
dalam bahasa apa pun yang menurut saya lebih masuk akal. Dalam hal bagaimana komputer melihatnya, seharusnya tidak ada perbedaan dalam masyarakat saat ini tentang kompiler dan juru bahasa yang sangat efisien.Jika ada perbedaan kinerja yang bisa didapat, saya yakin terjemahan ke MSIL akan dioptimalkan. Anda dapat memeriksanya jika Anda benar-benar menginginkannya.
sumber