2012-05-30 18 views
22

Bunun için neden olduğunu merak ediyorum.C++ Boolean değerlendirmesi

int main() 
{ 
    bool answer = true; 
    while(answer) 
    { 
     cout << "\nInput?\n"; 
     cin >> answer; 
    } 
return 0; 
} 

Beklenen davranış: 0 - Çıkışlar programı 1 - yine

ister

Gerçek davranış - 1 dışında herhangi sıfır olmayan tamsayı , yine ister: 0 - Beklendiği gibi, 1 - beklendiği gibi, 1 dışında herhangi bir sıfır olmayan tamsayıdır - sonsuz döngü

http://www.learncpp.com/cpp-tutorial/26-boolean-values/

kaynaktan

Program neden sonsuz bir döngüye giriyor?

+8

+1 şeklinde yeniden yazabilirsiniz.Boole kırmızı bir ringa balığıdır; asıl mesele, akarsu girdisinin işe yaraması ile ilgilidir. Bir int ile aynı şeyi deneyin ve sonra bir harf girin ve ne olduğunu görün ;-) – Cameron

+0

Belki yanılıyorum ama giriş formu komut satırı aldığınızda ... bu bir dize haline gelmez ve böylece aslında dize ve boole arasında dönüştürme? Hangi şeyler berbat olabilir .... –

+0

Cameron iyi bir noktaya yapar: bir karakter bir tamsayıya dönüştürülebilir. Örneğin, '' A '== 65', ama aynı şey olur. – chris

cevap

23

, bir bool okunması için kullanılan operator>> aşırı sadece 0 veya 1 olarak geçerli giriş değeri verir. Operatör aşırı girdi akışından bir sonraki numarayı okur num_get sınıf şablonu, uygulamalara atıfta ve daha sonra, aşağıdaki gibi davranır (C++ 11 §22.4.2.1/6):

  • değeri Varsa saklan 0 ise false saklanır.

  • Değer 1 ise true saklanır.

  • Aksi true saklanır ve ios_base::failbiterr atanır. Burada

(err

okumakta olduğunuz hangi akışın hata durumudur;. cin bu durumda hiç Boolean verir boolalpha manipülatör kullanılan davranışı belirterek ek dil, olduğunu unutmayın isimlerini, true ve false kullanılarak sokulur ve ekstre edilmesi;. ı kısalık bu ayrıntıları atlanmış)

zaman giriş sıfır veya bir, başarısız durum ayrıca, diş çekimi neden akımı üzerinde yer alır dışında bir değer başaramamak. answer, true olarak ayarlanmıştır ve sonsuz döngüye neden olarak sonsuza kadar true kalır.

Çıkartmanın başarılı olup olmadığını ve akışının hala iyi durumda olup olmadığını görmek için, akışın durumunu her ayıklamadan sonra sınamanız gerekir. Örneğin, iyi yazılmış bir soru için döngüsünüzü

+0

+1: Kabul edilenin çok daha iyi cevabı çünkü standardın bu davranışı yerine getirdiğini açıklıyor. –

+0

Anlaşıldı :) Cevabı daha iyi bir anlayış vermeyi yansıtacak şekilde değiştirdi. Giriş onaylama neden her zaman önemli bir örnektir kesinlikle :) –

15

operator>> girişi, giriş 0 veya 1 değilse ve başarısız olduğunda, giriş tüketmez. Böylece döngü, rakamı okumaktan ve tekrar tekrar okumadan oluşur.

görmek için böyle bir kod değiştirmeyi deneyin: Aslında

if (cin >> answer) { 
    cout << answer << endl; 
} else { 
    cerr << "oops" << endl; 
    break; 
} 
+4

Genelde, 'cin >> cevabı yerine' if (! (Cin >> answer)) 'yazmayı istemeseniz de; if (cin.fail()) ' –

+0

Sadece bir şey yazıp geri dönüşü iseniz, bunu ve programın" askıda kaldığı "türünü denediniz. Ancak, tekrar yazarsanız, girdiyi değerlendirmek için devam eder. Niye ya? –

+3

'if (cin.fail())' anti-pattern'i yaymak için düşürüldü. İşlemin sonucunu test edin (@SteveJessop'un önerdiği gibi) akış durumunu değil. –