İçinde "sonu" olan "while (true)" döngüsü terimi nedir? [kapalı]


24

Diyelim ki C ++ veya C # ile böyle devam eden bir döngü var:

while( true ) {
    doSomething();
    if( condition() ) {
        break;
    }
    doSomethingElse();
}

Bu genellikle "sonsuz döngü" olarak adlandırılır. Ancak teknik olarak sonsuz değildir - kontrol aktıktan sonra durur break.

Bu tür bir döngü için kullanılan terim nedir - "sonsuza kadar döngü" döngüsüne sahip kontrol döngüsü ifadesi ve "kırılma" ifadesi?


22
Özel bir terim olduğunu sanmıyorum.
ChrisF

2
Kontrolün aradan geçeceğine dair herhangi bir garanti var mı? Bu örnekte, ya condition()her zaman yanlış olursa ? Bunun şartlı aralarla sonsuz bir döngü olduğunu söyleyebilirim.
JohnL

1
Olmasa bile break, döngü sonsuz değildir ( kill, ctrl-alt-del, fişi çekin ...). Peki neden terminoloji detayları ile uğraşmıyorsun?
mouviciel

5
"Terim nedir?" - "Buna genel olarak sonsuz döngü denir". İşte cevabınız bu. Terimden memnun değilsiniz ama bu, (doğal) dillerin betimleyici olduğu gerçeğini ortadan kaldırmıyor. "X terimi", insanların ne kullandıklarını, ne kullanmaları gerektiğini değil.
MSalters

5
Bu soru konu dışı gibi görünüyor, çünkü "o şeyin adı" sorusu. "Bu şeyin ismini" aynı nedenlerle "bu belirsiz TV şovunu, filmi ya da kitabını karakterleri ya da hikayeleriyle tanımlayın" gibi kötü sorular: kötü sorular: Google'ı yapamazsınız, hiçbir şekilde pratik değildirler, kimseye yardım etmeyin ve başka türden marjinal soruların sorulması için kapıyı açmalarına izin vermeyin. Bkz blog.stackoverflow.com/2012/02/lets-play-the-guessing-game
sivrisinek

Yanıtlar:


24

CS eğitimi alan bu profesör bize ön kontrol döngülerinin ( while(cond) {}), kontrol sonrasındaki döngülerin ( do {} while(cond);) ve orta kontrol döngülerinin olduğunu öğretti . (Bunu İngilizce'ye fena halde çevirmiş olabilirim, ama siz anladınız.)

C ve C ++ ikincisine sahip değildir (ISTR Ada sahip, BICBW), bu nedenle yapınız bunun için C ve C ++ 'da kullanılır.


1
Evet, Ada'da şu şeyler var:loop ... exit when condition; ... end loop;
Keith Thompson,

@Keith: Onaylamak için teşekkürler! Ada'yı yaptığımdan bu yana neredeyse 20 yıl geçti.
sbi

1
Buna değer, 20 yıldan fazla bir süredir profesyonel bir programcı oldum (ve bundan daha uzun bir hobi) ve bu şartları hiç duymadım.
offby1

Tercüme ilişkin olarak - "pre" ve "post" kullanıldığında "in" in genellikle daha uygun olduğunu düşünüyorum, örneğin "preorder / postorder / inorder ağaç traversal".
Oak

1
Büyüdüğüm terim "ortadaki çıkış döngüsü" idi. Çıkış ortası döngüleri için açık destek olan birkaç farklı dilde çalıştım.
mjfgates

13

Stanford'daki CS'deki ilk kurs ( Mehran Sahami'nin Programlama Metodolojisi ) bunu bir buçuk döngü olarak adlandırıyor . Ve mutlaka kötü programlama pratiği değildir. (Alınan kullanıcı girişi toplayarak bu örneği düşünün Eric Roberts tarafından Sanatı ve Java Bilimi da diyor Roberts, bir döngü-ve-bir buçuk ):

prompt user and read in the first value
while (value != sentinel) {
    process the data value
    prompt user and read in a new value
}

Ve sonra aynı şey yinelenen kodu önlemek için döngü ve yarım fikir kullanarak çözüldü :

while (true) {
    prompt user and read in a value
    if (value == sentinel) break;
    process the data value
}

10

Resmi bir isim yoksa, buna Kırık Döngü denir . Bu terimin belirsizliği kastedilmiştir, çünkü bir döngünün ortasındaki bir kırılma, neredeyse bir gibi, biraz kirlidir goto.


Bir gotodan çok daha kötü olduğunu söyleyebilirim. Böyle bir döngüde sahte olarak oluşturulmuş bir durumdan ziyade gotoyu görmeyi tercih ederim.
Brian Knoblauch

14
@Brian Ne? 'Gerçek' koşulu onu açıkça ortaya koyar ve böyle döngüler gerçekten yaygındır. Örneğin, bir dosyanın her satırını bir listeye eklemek istiyorsanız, satırı okumayı denemelisiniz (bir şey yapın), başarısız olursa durun (koşul kırılırsa), aksi takdirde listeye ekleyin ve tekrarlayın (bir şey yapın) Başka).
Craig Gidney

7
Bir döngünün ortasında kırılma ile ilgili yanlış bir şey yoktur. Döngünün her başlangıcında bir işlem yapmanız gerekirse, kodu kopyalamanız veya bu işlemleri duruma geçirmeniz gerekecektir. Her iki model de açıkça dezavantajlara sahiptir. gotoaynı zamanda geçerli bir deneyime sahipti, örneğin bir deneme emülasyonu ... sonunda C'de blok.
Malcolm

1
Malcolm: Muhtemel problem, kodu okurken, döngünün ne zaman ve neden çıkıldığını görmenin zor olmasıdır. İki veya daha fazla bu döngüyü yuvaladığınızda ve iç döngüde bulunan bir koşula bağlı olarak dış döngüden kopmak istediğinizde ek sorunlar ortaya çıkar.
user281377

Let Diyelim ki bir olay döngü (sözde kod :) olduğu gibi bir Xorg uygulamasını sürüş söylüyorlar while(XEventGet(&ev) != NULL){ ... }, doğal döngü içinde anahtarlarını kontrol etmek istiyorum gidiyoruz: if(ev.key == XK_q) break;. Aşağıdakileri yapın:, while(XEventGet(&ev) != NULL && ev.key != XK_q){ ... }orta döngü aradan okumak için çirkin ve tartışmalı olarak daha zordur. Ayrıca, kontrol edilmeden önce ilk olarak değere bir şey yapılması gerekiyorsa? Bunların hepsini cildin temel çantasına doldurmayacaksın, değil mi?
Braden Best

8

Kesin bir isim yok. Sonsuz döngü bence uygun terimdir. Hiçbir döngü gerçekten sonsuz değildir, ancak bu, kırma içeren dalın asla gerçekleşmemesi muhtemel olduğundan etkin bir şekilde sonsuz olma potansiyeline sahiptir.

Birine "sonsuz bir döngü oluştur ve X koşulu için bir mola kullan" derseniz, ne demek istediğinizi anlarlar. Birisi kodunuzu gözden geçiriyor ve "Yazdığınız sonsuz döngüyü sevmiyorum" dan başka bir şey söylemezse, ne hakkında konuştuklarını bileceksiniz (elbette birden fazla varsa).


1
Sonsuz bir döngü değil; normal bir whiledöngü gibi iyi tanımlanmış bir sonlandırma koşulu var ve sonlandırma ispatını yapma şekliniz tam olarak aynı (monotonluğu azaltan bir ölçüm bulmak harika bir başlangıç).
Donal Fellows,

8

Koşullu yanlış yerde bir süre-süre döngü var.


2
Evet, yazılmalıdır: while (keep_going) {doSomething (); if (condition) {keep_going = false; } else {doSomethingElse (); }}
Stephen Gross

10
yani, diyorsunuz ki, eğer bir bilgisayar kursu öğretiyorsanız ve bunu tanımlamak istiyorsanız, şunu söylersiniz "ve şimdi, koşullu olan yerde yanlış olan * do-while döngüsünü öğreneceğiz "? Bu bir isimden çok, dini bir görüşe benziyor.
Bryan Oakley

5
@StephenGross Bu kod pasajı korkunç bir öneri. Asıl koşulu döngü tanımına koymak için refaktör veya sadece breakveya kullanın continue. Her ne pahasına olursa olsun sentinel değerlerinden kaçının, bunlar sadece kodun amacını gizleyen, zihinsel olarak takip edebileceğimiz keyfi bir durumdur.
Izkata

2
Sentinal değerler gecikmeli geçmelerdir.
Winston Ewert,

2
Tek çıkışlı weenie olduğu için -1.
Bağış Adamları

6

Ben oy veririm "koşulsuz döngü" "koşulsuz atlama" benzer. Neler olup bittiğini tam olarak gösterir (kod koşulsuz olarak döngüye girer), yalan söylemeden ("sonsuz döngü" den farklı olarak).


1
Ancak sonlandırma koşulu vardır; Bu if/ breakortadaki desenin bir parçasıdır.
Donal Fellows,

5

Bu tür bir döngü için kullanılan terim nedir - "sonsuza kadar döngü" döngüsüne sahip kontrol döngüsü ifadesi ve "kırılma" ifadesi?

Bir mola koşulu ile sonsuz bir döngü.

Ammilind ile aynı fikirdeyim, eğer özel bir isim vermek istersen Sonsuz Kısmi Döngü olarak adlandırabilirsin.


1
Hiç de sonsuz değil; sonlandırma koşulunun kontrol edildiği nokta sadece farklı bir yerdedir.
Donal Fellows,

5

Rosetta Kodunda, bu belirli model “N artı bir yarım” döngü olarak tanımlanmaktadır . En sevdiğim terim olmasa da, korkunç değil ve açıkça bazı döngüler için kullanışlı bir kalıp. (Alternatifler, durum öncesi kodu - gerçek programlarda potansiyel olarak zor - yapmak veya bir döngü koşulu değişkeni eklerken durum sonrası kodun iç içe geçmiş derinliğini artırmaktır; kodun korunabilirliğini veya anlaşılabilirliğini de iyileştirmez. Bu tür yapıların reddedilmesinin tek sebebi, birinin döngüler yazmadan özgür kalması konusunda ısrar breaketmesidir.)


4

Standart bir terim yoktur, ancak Kısmi döngü olarak söylerdim .

Bu döngü, yalnızca döngünün bir bölümünü son kez çalıştırdıktan sonra kırmak istediğinizde kullanılır (örneğin kısmi çalıştırma). Tüm döngüyü kırmak isteyebileceğiniz uygun bir durum bulamadığınızda kullanılır .

Bu durumda, en azından doSomething()son bir kez çalıştırdıktan sonra döngüyü kırmak istersiniz .


2

Burada sbi ile aynı fikirdeyim - orta kontrol döngüsü terimini seviyorum . Bu tür bir yapı, Yapısal Programlama yuvarlanmaya başladığında daha popülerdi ve birçok dil onlara sözdizimsel destek verdi.

Bununla birlikte, artık whiledöngüler genellikle daha elverişlidir, çünkü değişmezler hakkında düşünmek daha kolaydır ve genellikle zor boş vakayı daha iyi ele alırlar.

Özel bir durumda, döngü sadece

for(; doSomething(), !condition(); doSomethingElse()){}

bu yüzden sadece breakya doSomethingda doSomethingElsebirden çok ifadeyle ilgiliyse sürümü kullanırdım ve onları sizin gibi ayrı fonksiyonlara ayırmamayı tercih ederim.

Bu, eğer döngünüz daha karmaşıksa, (başlangıç, kontrol, artış) yinelemeden sonra, daha basit bir şey haline getirmeyi düşünmelisiniz.


1

Sanırım bunun için bir terim bulmaya çalışacaksak, belki:

Kaçabilir döngü


-1. Soru bir isim oluşturmakla ilgili değil, ortak bir adın var olup olmadığıyla ilgili. Ayrıca, tüm döngüler "kaçabilir" olduğundan, özellikle etkili bir isim değildir.
Bryan Oakley

@BryanOakley Sonsuz bir döngü, tanımı gereği, kırılabilir olmamalıdır. Muhtemelen bunun için kötü programlama dışında bir terim olmamalıdır.
LarsTech


0

Her durumda o kadar da kötü değil. Kendimi belirli tür API'lerle bu tür döngüler yazarken buluyorum. Örneğin, bir döngü nesneniz olduğunu ve bunun gibi oldukça derin bir durum olup olmadığını kontrol etmeniz gerektiğini söyleyin:

while (loop
    .getAExecutionModelFactory()
    .getActiveXexecutor()
    .getYCancelModelHandler()
    .getCurrentHandler()
    .isCancelled()) {
        // ... do something with the current Handler ....
        loop = ..... // prepare for next loop
}

Şimdi her getXXX yönteminin potansiyel olarak boş dönebileceğini düşünelim. Öyleyse, oldukça karmaşık ve okunamayan bir ifade olsa da, boolean bir ifade yazmak yine de mümkün olacaktır. Ve sonra, geçerli işleyici nesnesine ulaşmak için hemen hemen aynı şeyi tekrarlamalıyız. Bu gibi durumlarda while (true)mola vererek bir döngü yazmayı daha kolay buluyorum .

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.