“For (;;)”, “while (TRUE)” den daha hızlı mı? Değilse, insanlar neden kullanıyor?


164
for (;;) {
    //Something to be done repeatedly
}

Bu tür şeylerin çok kullanıldığını gördüm, ama bence çok garip ... Söylemek çok daha net olmaz mıydı while(true), yoksa bu şeyler boyunca bir şey mi?

(Birçok programcı şifreli kod başvurmak nedeni olarak) bu küçük bir fark daha hızlı olduğunu tahmin ediyorum?

Neden ve buna gerçekten değer mi? Öyleyse, neden sadece bu şekilde tanımlamıyorsunuz:

#define while(true) for(;;)

Ayrıca bakınız: Hangisi daha hızlı: while (1) veya while (2)?


51
Nedir TRUE???
AnT

20
@Steven Sudit: TRUEC ile ne ilgisi var? C99'da gerçek boolen sonucu için standart makro hala var true. Nereden TRUEgeldi?
AnT

31
Bu makro çalışmıyor, #define EVER ;;ancak IOCCC'de kullanılmış .. :)

18
Bu makro , hiç kullanılmamış #define while(TRUE)denilen bir argümanı alan bir makro bildirmek için değil TRUE, bu nedenle programınızdaki her while döngüsünü sonsuz bir döngüye dönüştürmek için değil mi?
AshleysBrain

9
@Steven Sudit: Hayır. "VS 6.0'da standart makro" yoktur. Makro TRUE, Windows API ile ilişkili başlık dosyalarından gelir. Hiçbir şekilde VS 6.0 ile ilgili değildir. Daha önce de söylediğim gibi, C veya C ++ ile ilgisi yoktur. C ++ 'da "true" değişmez değeri sadece true(VS 6.0'da da), C89 / 90'da böyle bir şey yok ve C99'da makro true. Bu, tüm C / C ++ derleyicileri için geçerlidir.
AnT

Yanıtlar:


262
  1. Daha hızlı değil.
  2. Gerçekten önemsiyorsanız, platformunuz için birleştirici çıkışı ile derleyin ve bakın.
  3. Önemli değil. Bu asla önemli değil. Sonsuz döngülerinizi istediğiniz gibi yazın.

227
Sezgisel olarak, sonsuz bir döngüyü optimize etmek sonsuz hızlanma potansiyeli sunar. Öyleyse sezgi üzerinde programlamadığımız iyi bir şey. :-)
Steven Sudit

5
Sanırım haklısın. Sanırım küçük şeyler hakkındaki "dini" tartışmalara kapılıyordum. Vicdanımı gevşediğin için teşekkürler. : D
Chris Cooper

6
@Steven LOL, bu ilginç, ama sonra sonsuz hızlanma potansiyeline gerçekten ulaştığınız tek senaryonun, döngü asla kırılmadığı ve gerçekten sonsuz çalıştığı, muhtemelen bir hata ya da istenirse bu potansiyele ulaşmadan önce sonsuz bir bekleme.
AaronLS

7
@Chris. Hayatta olduğu gibi programlamada da, dini tartışmalar sadece gerçekten önemli şeyler için zaman ayırmaya değer. Bu sadece bunlardan biri değil. Gördüğünüz gibi, herkesin bitmeyen bir döngü yazmanın evcil bir yolu var. Küçük şeyler için sizi en mutlu eden şeyi kendiniz seçin ve daha sonra önemli kod üzerinde profiler çalıştırın. :)
Ben Zotto

3
Bazı platformlardaki bazı erken derleyiciler sabit yükledi ve koşullu bir sıçrama yaptı. O günlerde donanım önemliydi.
peterchen

176

for(;;)İki nedenden dolayı tercih ederim .

Birincisi, bazı derleyicilerin uyarılar üretmesidir while(true)("döngü koşulu sabit" gibi bir şey). Uyarılardan kaçınmak her zaman iyi bir şeydir.

Bir diğeri, bence for(;;)daha açık ve daha açıklayıcı. Sonsuz bir döngü istiyorum. Tam anlamıyla sahip hiçbir şey bağlıdır, hiçbir koşul. Bundan kurtulmak için bir şeyler yapana kadar sonsuza kadar devam etmesini istiyorum.

Halbuki while(true), bir şeyle ilgili gerçek olan ne? Gerçek yanlış olana kadar döngü ile ilgilenmiyorum, bu formun tam anlamıyla söylediği şey (gerçek doğru ise döngü). Sadece ilmek yapmak istiyorum.

Ve hayır, kesinlikle hiçbir performans farkı yok.


73
Uyarıları önlemek için +1. Ancak açıklığa gelince, bu bağlamda olduğundan daha netken buluyorum. Sanırım bu yön kişisel tercihinize bağlı.
Tim

14
Evet, tercih ve alışkanlık. Görmeye alışkın değilseniz for(;;), garip görünecektir. Ama bunun nedeni buna alışması çalışıyor öneririm olan ortak bir deyim, tekrar içine bitecek. ;)
jalf

7
jalf'ın deyimsel olduğu hakkındaki yorumu buradaki cevaptır. Genellikle bu çünkü "sonsuz döngüye" için kullanılıyor ise sadece kendinden takviye kongresi - Bir deyim için iyi bir sebebi olmalı yok C. "sonsuz döngü" yazma yaygın olarak kullanılan bir yoldur.
caf

7
@Steve: Neden hiç kullanacağımı anlamıyorum for(;condition;). While döngüsü bunun içindir . Ama dediğim gibi, sonsuz bir döngü ile, derleyicinin herhangi bir koşulu karşılaştırmasını gerçekten istemiyorum . Safça bir ile whiledöngü, bu test etmek olurdu trueher yinelemesini (hatta aptal derleyici bunu yapabilir, belli ki, ama rahatsız ediyor beni. O kodunuzu overspecifying olarak beni vurur ilke) bir ile yaparken, for(;;)kelimenin tam anlamıyla diyorsun msgstr "test edilecek bir koşul yok. Sadece döngü yap". Hayal loop {...}
gücünüze

32
while(true)Uyarı verirse derleyiciniz emer .
Albert

56

Şahsen kullanıyorum for (;;)çünkü içinde herhangi bir sayı yok, sadece bir anahtar kelime. Ben tercih while (true), while (1), while (42), while (!0)vs vs.


38
0, 1 ve sonsuzluk kabul edilebilir sihirli sayılardır, 0 ve 1'i yanlış ve doğruya genişletmek bir kayıp değildir. sihirli bir anahtar kelimeden truedaha çok sihirli bir sayı değildir forveya for(;;)örtülü bir sihirli sonsuzluk kullanır. ( while (42)gerçekten iğrençtir.)

38
Teğet: CS profesörlerimden biri "programlamada sadece üç sayı var: 0, 1 ve n. Başka bir şeye sihirli sayı denir" dedi.
Ben Zotto

21
while (42) en havalı, while (1) veya while (true) veya while (! 0) ile ilgili farklı bir sonuç vermez ve felsefi anlamı vardır. Sanırım for(;;)yine de diğerlerinden daha hızlı ayrıştırılıyor
ShinTakezou

2
@ShinTakezou çok daha iyi #define LIFE 42 while (LIFE):)
mr5

1
iyi while(true)de herhangi bir sayı içermiyor. and for (;;) bir anahtar kelime değildir
RiaD

49

Dennis Ritchie yüzünden

  • Kullanmaya başladım for (;;)çünkü Dennis Ritchie bunu K&R'de yapıyor ve yeni bir dil öğrenirken her zaman akıllı adamları taklit etmeye çalışıyorum.

  • Bu deyimsel C / C ++. C / C ++ alanında çok şey yapmayı planlıyorsanız, uzun vadede buna alışmak muhtemelen daha iyidir.

  • Kişisel #definebir şey # define'd olma beri irade değil iş, bir C tanımlayıcı gibi görünmek zorunda.

  • Tüm modern derleyiciler iki yapı için aynı kodu üretecektir.


10
Evet, birisinin C'yi K&R'den öğrenmesi gerektiği gibi öğrendiği budur. Ne zaman while(TRUE)görsem, programcının bir C newbie olduğundan ya da For Dummies kitabından C öğrendiğinden şüpheleniyorum.
Kristopher Johnson

13
Bu yeni başlayanların da yeni çıkmış işlev tanımı stilini kullandığını duydum .
Justin

46

Herhangi bir aklı derleyicide kesinlikle daha hızlı değil. İkisi de koşulsuz sıçramalar halinde derlenecek. For sürümünün yazılması daha kolaydır (Neil'in dediği gibi) ve döngü sözdizimini anlarsanız anlaşılır olacaktır.

Eğer merak ediyorsanız, gcc 4.4.1 bana x86 için ne veriyor. Her ikisi de x86 JMP komutunu kullanır.

void while_infinite()
{
    while(1)
    {
    puts("while");
    }
}

void for_infinite()
{
    for(;;)
    {
    puts("for");
    }
}

derler (kısmen):

.LC0:
.string "while"
.text
.globl while_infinite
    .type   while_infinite, @function
while_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L2:
    movl    $.LC0, (%esp)
    call    puts
    jmp .L2
    .size   while_infinite, .-while_infinite
    .section    .rodata
.LC1:
    .string "for"
    .text
.globl for_infinite
    .type   for_infinite, @function
for_infinite:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $24, %esp
.L5:
    movl    $.LC1, (%esp)
    call    puts
    jmp .L5
    .size   for_infinite, .-for_infinite

Hata ayıklama modunda bile daha hızlı olduğundan şüpheliyim.
Steven Sudit

106
for_infinitedaha hızlı; 2 karakter daha az puts.
Dave Jarvis

43

Ben tercih ediyorum for (;;)çünkü en farklı C benzeri dillerde tutarlı.

C ++ ' while (true)da iyidir, ancak C'de tanımlamak için bir başlığa güvenirsiniz true, yine TRUEde yaygın olarak kullanılan bir makrodur. Eğer kullanırsanız while (1)o C ve C ++ doğru olduğunu ve JavaScript, ancak döngü koşulu gerektiren Java veya C # gibi, bir boolean olmak while (true)ya while (1 == 1). PHP'de, anahtar kelimeler büyük / küçük harfe duyarlı değildir, ancak dil büyük / küçük harf kullanımını tercih eder TRUE.

Ancak, for (;;)tüm bu dillerde her zaman tamamen doğrudur.


9
Cevabınız için teşekkürler! Bence bu aslında daha iyi objektif bir yol gösteren ilk cevap for (;;).
Chris Cooper

8
Hiç C, C ++, JavaScript, Java ve C # doğru kod yazmak zorunda sanmıyorum. Bunlar farklı diller.
Keith Thompson

6
@ KeithThompson birçok dilde doğru kod yazmakla ilgili değil; farklı geçmişlere sahip geliştiriciler arasında yanlış yorumdan kaçınmakla ilgili olduğunu düşünüyorum.
Mauro Sampietro

6
@ sam: Hem C while (1)hem for (;;)de sonsuz döngüler için ortak deyimlerdir. C programını okuyan veya ikisini birden anlamayan herkes kodun geri kalanıyla ilgili sorun yaşayacaktır. C. bilmeyen biri tarafından kolayca okunabilen C kodu yazmak faydalı değildir
Keith Thompson

6
@KeithThompson Yetkili bir C okuyucu her iki deyime kesinlikle aşina olsa da, yazar çok dilli bir programcı ise bu da yararlı olabilir. Son işimde günlük olarak JS, ActionScript ve PHP'de çalıştım ve kişinin kod yazma şeklini birleştirmek (bunun mantıklı olduğu yerlerde) programlamayı daha hızlı ve bakım yapmayı kolaylaştırabilir.
Ionoclast Brigham

21

Ben şahsen for (;;)(ki aynı kodla derleyecek deyim) tercih ederim while (TRUE).

Kullanmak while (TRUE)bir anlamda daha okunabilir olabilir, for (;;)deyim kullanmaya karar verdim çünkü öne çıkıyor .

Sonsuz döngü yapısı kolayca fark veya kodunda seslendi ve ben şahsen düşünüyorum edilmelidir for (;;)tarzı daha bu biraz daha iyi yapar while (TRUE)veya while (1).

Ayrıca, bir while döngüsünün kontrol ifadesi sabit olduğunda bazı derleyicilerin uyarılar verdiğini hatırlıyorum. Bunun çok fazla olduğunu düşünmüyorum, ama bundan kaçınmak istemem için sadece sahte uyarılar potansiyeli yeterli.


17

Bazı insanların bunu tercih ettiklerini gördüm çünkü böyle bir yerde # tanımları var:

#define EVER ;;

Bu da onları yazmalarını sağlar:

for (EVER)
{
    /* blah */
}

24
Ben de gördüm; ama tercih etmek için iyi bir neden değil. Bir sürdürücü olarak, makro kodunu beklediğiniz şeyi yaptığından emin olmak için kontrol etmelisiniz, oysa orijinal kod yeterince açıktı. RTOS VxWorks'te FOREVERtanımlanmış bir makro vardır for(;;), ancak bu daha iyi değildir. IMO makroları yeni bir dili 'icat etmek' için kullanılmamalıdır.
Clifford

8
Aslında bazı dillerdeki makroların amacı yeni sözdizimi icat etmektir. Ancak C / C ++ 'daki (EVER) için bakılmaksızın iğrençtir.
Dan Olson

15
Bazı insanlar Pascal gibi derler eğer gibi komik şeyler #define BEGIN {ve #define END }. #define DONKEYS_FLY (0)Söyleyebilmeleri için gördüm bile if DONKEYS_FLY .... Kim demiş yazılım donuk?
Mike Dunlavey

11
California'da sana inanıyorum ki (;;) için # tanımlamak zorundasın LIKE_FOREVER
Martin Beckett

1
Dayanamadım: #define never while(0)ve#define always
alfC

16

Peki ya (diliniz destekliyorsa):

start:
/* BLAH */
goto start;

... herhangi bir makul derleyicinin elinde aynı çıktıyı üretmelidir.
Ben Zotto

9
+1! Çok gotosayıda dezavantajını düzeltmez , ancak uygulamaya çalıştığınız algoritma bir akış şemasından geliyorsa, bu en doğrudan çeviri demektir.
Edmund

4
Ben şahsen goto hakkında faydacı bir görüş benimsiyorum. Raptor yok. Yırtıcı kuşlar insanlardır. Ve spagetti kodu yapmak için goto kullanmaya başlayan insanlardı. Ayrıca, bir döngü için birleştirilmiş çıktı hemen hemen bu şekilde görünür. Bilgisayarlar için komut kümelerinin "for" veya "while" kavramları yoktur, sadece "jump".
josaphatv

asla hiç kullanmagoto
Edward Karak

Hakkında gerçekten güzel bir şey , döngü daha az sonsuz hale getirmek için gotobir ekleme konusunda endişelenmenize gerek yok break. (daha önce başka bir döngü whileveya fordöngü içinde değilseniz ...)

12

Oluşturulan makine kodu açısından bir fark yoktur.

Ancak, sadece eğilimi artırmak için, while (TRUE) formunun (;;) 'den çok daha okunabilir ve sezgisel olduğunu ve okunabilirlik ve netliğin, kodlama kuralları için herhangi bir nedenden çok daha önemli nedenler olduğunu iddia ediyorum. for (;;) yaklaşımını duydum (kodlama yönergelerimi sağlam akıl yürütme ve / veya etkililik kanıtı üzerine dayandırmayı tercih ediyorum).


6
Bu sizin dilinize bağlıdır. for(;;)C ve C ++ 'da bunu yapmanın geleneksel yoludur. while(true)C # ve Java ve diğer dillerde kongre gibi görünüyor. Kilometreniz değişebilir.
Billy ONeal

9
Evet ve C veya C ++ 'a çok aşina olmayan biri, STRING_SCAN_FORMATTED'i sscanf'den daha okunabilir bulabilir, ancak kodunun üstüne #define STRING_SCAN_FORMATTED sscanf koyan kimseyi göremezsiniz.
ta.speot.is

4
Bunu yapmanın deyimsel yolunun geliştiriciniz için en okunabilir olması daha iyi olurdu diyebilirim . Aksi takdirde gerçekten daha iyi geliştiricilere ihtiyacınız var.
jalf

5
@despart: Birisi C ++ ile ne olduğunu bilmeyecek kadar tanıdık değilse, kod tabanımdan uzak durmaları gerekir.
Billy ONeal

4
İdiyomatik yolun en okunabilir olması gerektiğine katılıyorum. Bu yüzden diller ve uygulamalar geliştikçe deyimsel yollara her zaman meydan okunmalı ve değiştirilmelidir. Korkunç K&R "deyimsel" kodlama stilinin modern, daha okunabilir stil ile değiştirilmesi yıllar sürdü, ama yine de oldu.
Jason Williams

11

Sadece iyi bilinen bir desen değil, C (ve C ++) da standart bir deyim


3
Evet, sanırım bazı derleyiciler while (true)de aynı şekilde uyarıyorlar if (true).
Steven Sudit

11
while(true)

Visual Studio ile uyarı oluşturur (koşul sabittir). Çalıştığım çoğu yerde üretim derleme hataları uyarıları ile derler. Yani

for(;;)

tercih edilir.


7
Visual Studio'nun hangi sürümünü kullanıyorsunuz? 2008 ile bu uyarı uyarısını 4. uyarı seviyesinde bile
almıyorum

11

Kodunuz derleyici tarafından optimize edilmişse her ikisi de aynı olmalıdır. Optimizasyon ile ne demek istediğimi açıklamak için, MSVC 10 ile yazılmış bir örnek kod:

int x = 0;

while(true) // for(;;)
{
    x +=1;

    printf("%d", x);
}

Hata Ayıklama modunda oluşturursanız ( herhangi bir optimizasyon (/ Od) olmadan ) sökme açık farkı gösterir. trueİçindeki durum için ekstra talimatlar var while.

while(true)
00D313A5  mov         eax,1                //extra 
00D313AA  test        eax,eax              //extra
00D313AC  je          main+39h (0D313B9h)  //extra
    {
        x +=1;
00D313AE  mov         eax,dword ptr [x]  
00D313B1  add         eax,1  
00D313B4  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D313B7  jmp         main+25h (0D313A5h)  


for(;;)
    {
        x +=1;
00D213A5  mov         eax,dword ptr [x]  
00D213A8  add         eax,1  
00D213AB  mov         dword ptr [x],eax  
    printf("%d", x);
    ...
    }
00D213AE  jmp         main+25h (0D213A5h)  

Ancak, kodunuzu Release modunda (varsayılan olarak Maksimize Hız (/ O2) ) oluşturursanız, her ikisi için de aynı çıktıyı alırsınız. Her iki döngü de bir atlama komutuna indirgenir.

for(;;)
    {
        x +=1;
01291010  inc         esi  

        printf("%d", x);
    ...
    }
0129101C  jmp         main+10h (1291010h)  

    while(true)
    {
        x +=1;
00311010  inc         esi  

        printf("%d", x);
    ...
    }
0031101C  jmp         main+10h (311010h)  

Hangisini kullanırsanız kullanın hız optimizasyonu ile iyi bir derleyici için önemli değil.


Bu aslında çok iyi bir nokta! Optimizasyon olmadan modern derleyiciler bile çeşitli talimatlarla farklılık gösterecektir.

9

Hangi yolun daha hızlı olduğu kişisel tercih meselesidir. Şahsen ben bir touchpistim ve programlama sırasında klavyeme asla bakmıyorum - klavyemdeki 104 tuşun hepsine dokunabilirim.

"While (TRUE)" yazarken daha hızlı buluyorum.

Zihinsel olarak bazı parmak hareketi ölçümleri ekledim ve topladım. "for (;;)", geri ve dördüncü hareketlerin yaklaşık 12 anahtar genişliğine sahiptir (ev anahtarları ve anahtarlar arasında ve ev anahtarları ve SHIFT tuşu arasında) "(TRUE)" ise yaklaşık 14 anahtar genişliğinde geri dördüncü.

Ancak, ikincisini yazarken çok daha az hataya yatkınım. Zihinsel olarak sözcükleri bir seferde düşünüyorum, bu yüzden "nIndex" gibi şeyleri yazmak için "nIdx" gibi kısaltmalardan daha hızlı buluyorum çünkü aslında zihnimde konuşmak ve parmaklarımın otomatik olarak bırakılması yerine yazı zihinsel olarak yazmam gerekiyor kelimeyi yazın (bisiklete binmek gibi)

(TypingTest.com karşılaştırmam = 136 WPM)


3
OP'nin yazma hızı değil, çalışma zamanı hızına atıfta bulunduğuna inanıyorum.

Biliyorum. Sadece üssü de örtmek zorunda kaldım.
Mark Rejhon

7
s / kişisel tercih / bireysel alışkanlık /
SamB

@ SamB: s /// için yorum yukarı oylama yapın. xD Ve evet, çalışma zamanı hızından kaynaklanıyor olabileceğini düşünsem de, gerçek cevabı bilmiyordum. Eğer bu olsaydı, mutlu olurdu.
Chris Cooper

Çalıştırın time head -10 >/dev/null, her 10 kez yazın ve sonuçları ölçün. Bahse girerim for(;;)hile yapmazsan daha hızlı olursun. % 14 civarındaydım.
PSkocik

6

Tüm iyi cevaplar - davranış tam olarak aynı olmalıdır.

ANCAK - Diyelim ki bir fark yarattı. Bunlardan birinin yineleme başına 3 talimat daha aldığını varsayalım.

Umursar mısın?

SADECE döngü içinde yaptığınız şey neredeyse hiçbir şey değilse , neredeyse hiç böyle değildir.

Demek istediğim, mikro optimizasyon ve makro optimizasyon var. Mikro optimizasyon "kilo vermek için saç kesimi almak" gibidir.


3
Ne sıklıkta insanların tercih anlattı görüyorsunuz ++iüzerinde i++?
Dennis Zickefoose

7
@Dennis Zickefoose: arasındaki fark ++ive i++eğer potansiyel olarak önemli olabilir ibir sınıfın örneği yerine bir dahili ve derleyici önemsiz optimizasyonunu geçerli değildir. Tavsiye, bir alışkanlık edinmektir, böylece önemli olduğunda sizi yakalamaz.
Clifford

5
++iVs hakkında bir i++şey, "optimizasyon" yapmak için size hiçbir maliyeti yoktur. Doğru, çoğu durumda kesinlikle hiçbir fark yaratmaz, ancak yazılması da eşit derecede kolaydır, bu yüzden neden varsayılan olarak en verimli olanı tercih etmiyorsunuz? Aynı şey burada da geçerli. Biri varsa oldu diğerinden daha küçük biraz daha hızlı, neden değil daha hızlı bir gitmek? Yaparak ne kaybederdik? Her ikisini de okumak ve yazmak oldukça kolaydır.
jalf

2
@Dennis Zickefoose: Haklısın. SO hakkında çok şey görüyorum ve Clifford'un yorumu doğru. Buna ek olarak, orada bir şey yok SO üzerinde bir sürü görmek ve bu 43x speedup gibi makro optimizasyonu, nasıl olduğunu: stackoverflow.com/questions/926266/... . Bu yüzden önceliklerimizi merak ediyorum.
Mike Dunlavey

2
@Mike: Evet, ama bu elma ile portakal karşılaştırması. Bir saç kesimi almak gerçek zaman ve muhtemelen para alır. Gerçekten önemli olmayan bir mikrooptimizasyon olduğuna katılıyorum. Ama bunun bize bir maliyeti de yok . sola veya sağa gitmeyi seçebilir ve mesafe aynı ise, arazi aynıdır, her şey aynıdır, ancak sol yolun bazı marjinal mikroskobik faydası vardır, neden sola gitmiyorsunuz? Haklısın, etkileyici bir tartışma değil. Ancak maliyet tam anlamıyla sıfır olduğunda, daha az optimum rotayı tercih etmek için hiçbir neden göremiyorum.
jalf

5

Değerli bir derleyicinin farklı bir kod üreteceğini düşünemiyorum. Olsa bile, daha verimli olan belirli derleyiciyi test etmeden belirleme yolu yoktur.

Ancak for(;;)aşağıdaki nedenlerden dolayı tercih etmenizi öneririm :

  • Kullandığım bazı derleyiciler uygun uyarı seviyesi ayarlarıyla (true) için sabit ifade uyarısı üretecektir.

  • örneğinizde TRUE makrosu beklediğiniz gibi tanımlanamayabilir

  • sonsuzun çok olası değişken varken döngü gibi while(1), while(true), while(1==1)vb .; bu nedenle for(;;)daha fazla tutarlılığa neden olması muhtemeldir.


DOĞRU #define DOĞRU 1 olmayabilir, ancak herhangi bir kod tabanı içinde while(TRUE)olarak değerlendirilir while(0)yarar olası değildir for(;;).
Justin

@Justin: Katılıyorum, gerçekten sapık olurdu ve bu üç argümanın en güçlüsü değil, ama Bjarne Stoustrup, C ++ 'da NULL makrodan kaçınmak için benzer bir argüman kullanıyor. while(true)her durumda tercih edilmelidir. C ++ ' boolda saklıdır ve C stdbool.h'de tanımlanmış C'de (C'de daha az güvenli olmasını sağlar). for(;;)tüm şüpheleri ortadan kaldırır.
Clifford

5
for(;;Sleep(50))
{
    // Lots of code
}

Şundan daha net:

while(true)
{
    // Lots of code
    Sleep(50);
}

Kullanmıyorsanız bu geçerli değildir Sleep().


1
Çok kötü bir kod, zamanlayıcı uyur yerine kullanılmalıdır, bu yüzden kötü bir örnek
ST3

12
@ ST3 - Evet, haklısın. Kodum çok kötü. Bir dahaki sefere sonsuz bir döngü yaptığımda daha çok denemeliyim.
Armada

1
@Frammo - işletim sisteminize bağlıdır, ancak genellikle böyle bir şeydirtimerService.scheduleRepeating (50, [] () { /* lots of code */ });
Periata Breatta

2
Böyle bir döngü için uyku gibi bir işlevi çağırmak hakkında temiz bir şey yok
Greg

1
OMG, timerService.scheduleRepeating (50, [] () {}) yazmak ve anlamak çok daha kolaydır (50).
Cool Cirit

4

"Sonsuza dek" döngüsü, gömülü sistemlerde arka plan döngüsü olarak popülerdir. Bazı insanlar bunu şöyle uygular:

for (; ;)
{
 // Stuff done in background loop
}

Ve bazen şu şekilde uygulanır:

while (TRUE /* or use 1 */)
{
 // Stuff done in background loop
}

Ve yine başka bir uygulama:

do
{
 // Stuff done in background loop
} while (1 /* or TRUE */);

Optimize edici bir derleyici, bu fragmanlar için aynı veya benzer montaj kodunu oluşturmalıdır. Önemli bir not: döngüler için yürütme süresi büyük bir endişe kaynağı değildir, çünkü bu döngüler sonsuza kadar devam eder ve işleme bölümünde daha fazla zaman harcanır.


8
Bir derleyici bunlar için farklı kod üretirse, derleyiciyi atma ve son yirmi yıldan bir tane alma zamanı gelmiştir.
GManNickG

5
"Bu döngüler sonsuza kadar sürdüğü için döngüler için yürütme süresi büyük bir endişe değil" - bu benim için çok yanlış geliyor ..
Blindy

3
@Blindy - çünkü yanlış, döngüsel mantığı işlemek için harcanan çalışma süresinin bir kısmı ya da her ikisi de döngü sonsuz
olana

3

(True) (;;) için olduğundan daha okunabilir olduğunu varsayalım - programcı döngü için bir şey özlüyor gibi görünüyor :)


Hızı önemsiyorum. Özellikle kodumu sonsuz kez etkileyecek bir optimizasyon varsa.
Kowalski

2

"(;;)" için "kullanmanın en önemli nedeni, keşif programlaması yaparken" while (TRUE) "kullanmanın korkusudur. "For" ile tekrarların miktarını kontrol etmek daha kolay ve "for" döngüsünü sonsuza dönüştürmek daha kolaydır.

Örneğin, özyinelemeli bir işlev oluşturuyorsanız, sonsuz bir döngüye dönüştürmeden önce işleve çağrı sayısını sınırlayabilirsiniz.

    for(int i=0;i<1000;i++) recursiveFunction(oneParam);

İşlevimden emin olduğumda, onu sonsuz bir döngüye dönüştürüyorum:

    for(;;) recursiveFunction(oneParam);

3
İlk döngüde bir sözdizimi hatası var (noktalı virgül eksik).
Jens

3
Ha! Böylece (;;);)
Andrew'in
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.