(;;) Yapılar için neden bu kadar çok şey görüyorum? [kapalı]


14

Düşünme şeklimde, bilinen veya belirlenebilir bir aralıkta yineleme yapmak için bir for döngüsü kullanılır.

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

(i bir kenara dahil) ile eşdeğerdir:

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

Başka bir deyişle, fordöngü yaygın olarak kullanılan bir whileyapı için basitçe (oldukça yararlı) bir sözdizimsel şekerdir .

Ancak, for(;;)web üzerinde işlevsel olarak eşdeğer olan birçok yapı görüyorumwhile(true)

Bunun sebebi nedir? Neden sonsuz for döngüsü sonsuz sonsuz döngüsü yerine tercih edilir?

// Döngülerken hiç kullanmayan bir java ders kitabı bile gördüm! Böyle korkunç yapılara liderlik etmek:

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

Ana neden tercih. Ancak seçim yapılırken okunabilirlik YMMV olarak kullanılmalıdır.
Aaron McIver

Neden biri garip yapıyı tercih eder ki?
Chris Cudmore

10
Takas edebilirsin whileve forburada ve soru değişmezdi. while(true)ve for(;;)aynı şey demek. Açıkçası güçlü bir tercihiniz var while, diğerlerinin de eşit derecede güçlü bir tercihi olabilir for. Birinin diğerinden daha doğru olduğunu söylemek imkansız.
Caleb

3
@chris, hiç for(;;)kafa karıştırıcı bulamıyorum . Bu standart bir C deyim, K&R (2e) bölüm 3.5'te belgeleyeceğiniz bir deyimdir. Anlıyorum seni öyle değil; Eğer diğerleri açıkçası (başka bunu görmek asla) tercih olduğunu anlamalıdır. C dışındaki dillerde az çok kabul edilebilir; sadece kesin bir cevap olasılığını azaltan bu dil bilincini etiketlediniz . Yine kapanmaya oy verdim çünkü Q yapıcı değil; Eğer rahatsız olsaydım, kapanmak yerine ya da kapatmaya ek olarak saldırgan olarak işaretlenirdim. Hepsi bu.
Caleb

1
Şahsen ben burada tamamen sonsuz döngüler için başka bir sözdizimine sahip olmak için gerçek bir fırsat olduğunu düşünüyorum: gibi bir şeywheeeeeeee { ... }
detly

Yanıtlar:


33

Bu, PDP-11'deki eski programlama uygulamalarından bekletilir (evet, eski dedim ). Döngülerin daha hızlı çalışmasını sağlamak için yararlı olan tek bir komutu kaydederdi.

Ek bilgi için aşağıdakilere bakın: http://www.flounder.com/exceptions.htm


3
Tam da aradığım şey buydu. Gerçek, meşru bir sebep var, ama artık geçerli değil.
Chris Cudmore

1
@chris Nnnope, modern derleyiciler bazen bir döngü durumunda bir sabit kullanmaktan şikayet edecektir. Bu tamamen bir engel değil.
Izkata

Bundan daha fazlası var. 1990'ların başında unix sistemlerinde C yazdığımı hatırlıyorum ve (true) {} bir seçenek değildi. Standart bir boole türü yoktu, ancak birkaç unix sistemi C başlık dosyalarında kendi tanımlarını yaptı. Bellekten, en azından bir unix satıcısı, kural başarı üzerinde sıfır döndürmek olduğu ve işlev sayılarının başarısız olması durumunda işlev dönüşlerine yardımcı olması için TRUE'yu sıfır olarak tanımladı. Bu, (TRUE) {} öğesinin taşınabilir olmadığı anlamına geliyordu.
Michael Shaw

1
Şu anda bulamıyorum, ancak birkaç yıl önce Dennis Ritchie'nin Usenet'te bunun yanlış olduğunu belirten bir yazı yazdığına ve for(;;)sözdizimini (onların görüşüne göre) daha doğrudan bir açıklama olarak kullandığına yemin edebilirim . döngüden çıkış için herhangi bir kriter belirtilmedi.
Jerry Coffin

@Ptolemy: Kesinlikle yazabilirdin while(1) { }.
Ed S.

10

Bazı derleyiciler kullanırken uyarı verir ( koşullu ifade gibi bir şey sabittir ), while( 1 )ancak for( ; ; )uyarılması gereken bir şey yoktur. Programcılar uyarı olmadan kod ister, bu nedenle for varyantını kullanırlar.


Derleyicilerin uyartığı bazı şeyler mükemmel şekilde geçerlidir ve hatta (bazı özel durumlarda) kaçınılmazdır. Yani bazılarımız uyarıları da uyarılar olarak görüyoruz. Onları görmezden gelirseniz, elbette lanet olası şeylere gömülüp önemli olanları göremezsiniz - ancak yerel veya küresel olarak uyarıları devre dışı bırakmak için pragmalar ve seçenekler vardır. Temel olarak, evet uyarıları olmamak daha iyidir, ancak genellikle daha kötü bir kod stili benimsemek için bundan daha güçlü bir nedene ihtiyacım var. Burada sadece daha kötü değil, ama "sonsuz" döngüler zaten nadir (veya çok kötü bir stil).
Steve314

5

Boole türü olmayan C programlamasından alınan bir alışkanlıktır. (1) potansiyel olarak eşdeğer olsa da, For (;;) genellikle doğru hatırladığımda K&R'de göründüğü gibi kullanılır. Orada bir yerde de bir donanım nedeni olduğundan şüpheleniyorum.


4
... Orada şüpheli oldu ... bir donanım nedeni
Aaron McIver

2
Edward Robertson'ın belirttiği gibi, bunun nedeni PDP-11'deki C derleyicisinin "while (true)" daki gerçekin derleme zamanı sabiti olduğunu ve derleme oluştururken fazladan bir komut (karşılaştırma) ekleyeceğinin farkında olmamasıdır. PDP-11'de bulunan sınırlı kaynaklar nedeniyle, programcılar bu ek bir komutu programdan çıkarmak için for döngüsünü kullandılar.
Jetti

3

çünkü (;;) "sonsuza dek" olarak okunabilir ki bazıları "gerçek" iken daha doğal bulur.


Bu orijinal neden olmasa da, tercihin orijinal nedenin modası geçmesinden çok sonra sıkışmasının ikincil bir nedenidir. Bununla birlikte, uzun süredir deneyimli programcılara sormaktan başka, bunu destekleyen herhangi bir kanıt elde etmek çok zordur.
DarenW

-2

Sorduğum tüm deneyimli programcılar veya ' for(;;)dan daha hızlı tanıyabilir .while(true)while(1)


2
Lanetlemeye değer herhangi bir programcı bu üçünü de hemen tanıyabilmelidir. Her üçü de kod okumak için 5 dakikadan fazla zaman harcayan herkesin her birini bir kaç kez gördüğü kadar yaygındır.
cHao

1
Çalışmalar, deneyimli programcıların :-) ' for(;;)dan 14ms daha hızlı kavrayabildiğini göstermiştirwhile(1)
kevin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.