C ++ 'ta bools ne zaman kullanmalısınız?


34

Tic Tac Toe oyunu yaratmak zorunda kaldığımız sınıfımız için bir görev aldık . İnsanlar kendilerini karmaşıklaştırmayı sever, bu yüzden menü içeren karmaşık oyunlar yazdılar. Oyunun sonunda tekrar oynama ya da programdan ayrılma seçeneğiniz vardı. Bunun için bir intdeğişken kullandım , ancak BOOL'ları kullanan bazı sınıf arkadaşları fark ettim.

Daha mı verimli? Sadece iki değeri saklaması gereken bir cevabı depoya intkoymak yerine saklamak arasındaki fark nedir? Bu değişkenlerin asıl amacı nedir?


32
Verimlilikten emin değil, fakat intbir tamsayı saklamak ve a'nın amacı boolbir boolean değeri ( trueveya false) depolamak . Bir boolIMO kullanmak, kullanımını bir kullanmaktan çok daha iyi yansıtır int.
George Duckett

12
Aslında, C ++ ve C99'dan önce, C89 bir Boole türüne sahip değildi. Programcılar sık ​​sık typedef int Boolbir boolean kullandıklarını netleştirmek için sık sık olurdu . C ++ bool, C99'u (oldukça çirkin) _Boolanahtar kelimesiyle olduğu gibi dile destekledi .
Charles Salvia,

Bu, "ne zaman kullanılacağını bilmek" ile ilgili değil bool, benzer türler ( length_tneden) için neden farklı adlara sahip olduğumuz ve derleyicinin türleri denetlemesinin neden önemli olduğu ile ilgili.
Abyx

Bazen cevap sadece 'tat' olur. Bahse girerim şu anda aynı ödevinizi tekrar yazarsanız, şu an için fonksiyon parametresi sırası ve adları gibi farklı şeyler olacaktır. Neden aynı parametre sırasını veya aynı adı yazmadınız? Bunun nedeni, henüz yapmadığınız ya da çok önemli olmadığı ve sadece ne yazdığınızdır

Yanıtlar:


82

Değişken türlerini ve değişken adlarını seçerken, niyetinizin mümkün olduğunca net olmasını istersiniz. Bir bool(boolean) tür seçerseniz , sadece iki kabul edilebilir değer olduğu açıktır: trueveya false. Bir kullanırsanız int(tamsayı) tipini, o değişkenin amacı, yalnızca 1 ya da 0 ya da her türlü Şunu seçti değerler olabilir artık açıktır trueve false. Artı sizeof(int), genellikle 4 bayt olarak geri sizeof(bool)dönerken 1 döndürür.


7
Kabul. Bence tasarım niyetleri daha önemli. Sadece ara sıra bunları geçersiz kılmanız gerekecek.
ChrisF

9
@ AndrewFinnel'ın amacını yeniden başlatmak için: Bool daha çok kendini belgeliyor. 0 veya 1 olarak ayarladığınız değişken bir sayaç olabilir; doğru veya yanlış olarak ayarladığınız değişken açıkça bir bayraktır.
Scott C Wilson,

2
Bools, bir değişkenin diğer kullanımlar için kötüye kullanılmasını önler. Kodunuzun farkında olmayabileceği ek durumlar oluşturmak için bir tamsayı 0 veya 1 dışındaki değerlere ayarlanabilir.
Michael Shops,

+1. Niyeti / seçenekleri netleştirir. "Evet" veya "hayır" değerine sahip bir dize de dahil olmak üzere değeri saklamak istediğiniz herhangi bir yöntemi kullanabilirsiniz, ancak EN ÇOK mantıklı olanı seçmelisiniz. Bu durumda, bu bir boolean.
Craige

C ++ 'daki booleanların ints, 4 byte ile aynı boyutta olduğunu düşündüm.
DogDog

53

Kimse OP hakkında konuştu gerçeğini yakalandı toplanan tüm (şu ana kadar) cevaplarında görünüyor BOOLdeğil bool.

Soru C ++ etiketli olduğundan, şunu belirtmek gerekir:

  • intarasında değişmektedir bir tamsayıdır INT_MINiçin INT_MAXtanımlanan makro - <climits>, değerleri barındıran makinenin mimarisini bağlıdır. C ++ 'da bu değerlere sırasıyla std::numeric_limits<int>::min()ve ...:max()olarak erişilebilir ). Boolean operatörlerin davranışı uygulanan inttedavi 0olarak FALSE gibi her şey doğrudur .
  • BOOLsadece bir int için bir boolean davranış öneren bir ipucudur. <cstddef>Olarak tanımlanır

    #define BOOL int
    #define TRUE 1
    #define FALSE 0
  • BOOLyani, sözdizimsel şekerden başka bir şey değildir, çünkü derleyici ile bir int'den başka bir şey değildir. C programcısının kullandığı bir şeydir, ancak C ++ programcıları C ++ 'dan beri kaçınmalıdır bool.

  • boolDesteklenen değerleri adil trueve olan bir dil integral türüdür false. Dönüştürüldüğünde int true1 falseolur ve 0 olur.

Önemli olan nokta, programlama hatalarına karşı daha güvenli olması:

BOOL a = FALSE;  // in fact int a = 0;
a = 5; //now a == 5 -- what does it mean?;

uygun bool tipi ile kodlamak mümkün değildir:

bool a = false;
a = 5; // error: no bool(const int&) available.

BOOLBunun yerine kullanmak bool, görkemli bir geçmişten miras kalan sadece kötü bir alışkanlıktır. Hiç kimse aslında hala unutamaz, bu nedenle yarın daha az şanlı için eski bir sorun yaratır.

Dil öğretmenleri ciddi olarak düşünmeli!


9
BOOL, C ++ ve C dilinin bir parçası değildir. Büyük harfli BOOL, C'lerin boolen türü olmadığı eski günlerde, booleanların C cinsinden uygulanmasının en yaygın yoludur. Örneğin, Windows API BOOL'u tanımlayacaktır. Ayrıca, BOOL'un nasıl tanımlandığına dair bir açıklama yoktur, bazı uygulamalar onu bir bitlik uzun bit alanı olarak tanımlayabilir. Bazı kütüphaneler onu böyle tanımladığından, bunun daima int ile eşit olduğunu kabul edemezsiniz.

1
+1. Belki de aslında yaptığı ortalama BOOL değil bool. Belki de BOOL potansiyel olarak farklı şekillerde uygulanabilir, ancak Codereview bu tür bir soruyu sorarsa bunu muhtemelen bilmiyordur. Bunun int olarak tanımlandığını görüyor, bu yüzden doğal olarak neden int kullanamadığını soruyor.
Neil

1
@ Lundin: genel olarak haklısınız, ancak bunun OP'nin BOOL ve int denkliği hakkında konuştuğu sorunun kapsamı içinde bırakılan bir cevap olduğunu düşünün.
Emilio Garavaglia

Buna rağmen, niyeti belirtmek için BOOL veya bool kullanma fikri hala geçerlidir.
Andrew T Finnell

1
@zvrba: true, ancak bu, MS'in kendi derleyicilerinde bool uygulamaya karar vermesinden kaynaklanıyor. Yalnızca Intel işlemciler için çalışan MS derleyicileri için geçerlidir. Intel platformunda 32 bitten daha kısa her integral türünün giriş veya çıkış için maskeleme gerektirdiğini unutmayın. Ama char [] hala kullanılmaktadır ve mutlaka her zaman int [] ile değiştirilmemelidir
Emilio Garavaglia

6

Bool türleri Int türlerinden daha küçüktür, bu nedenle bellekte daha az yer kullanır. Bir / Bo için derlediğiniz sisteme bağlı olarak, bir Int 4 - 8 bayt olabilir, oysa bir Bool 1 bayttır ( bu MSDN makalesinde görüldüğü gibi )

Bunu KISS ve iyi program tasarımının bazı yönleriyle birleştirin ve neden sadece 2 değere sahip olacak bir değişkeni saklamak için bir bool kullanmanın daha iyi olduğu ortaya çıkıyor.

Neden yalnızca iki farklı değerden yalnızca birini saklamanız gerektiğinden emin olduğunuzda, geniş bir değer aralığını depolayabilen bir nesneyle işleri neden zorlaştırıyorsunuz?

İçinde 75 saklarsanız, int kullanan sistemde ne olur? Ekstra koşul eklediyseniz

if (value >= 0 )
  return true;  //value is greater than 0, thus is true
else
  return false; //value is 0 or smaller than 0, thus is false

veya

if (value == 0)
  return false;  //value is greater than 0, thus is true
else if (value == 1)
  return true; //value is 0 or smaller than 0, thus is false

o zaman bu durum için kapandın. Ama eğer yapmadıysan, o zaman olmazsın.

Ayrıca, arabellek taşması olan (int değerini nasıl değiştirdiğinize bağlı olarak) ve "0 değerine" sıfırlar veya int'inizin alt sınırını (yani içinde bir yerde olabilir) olan bir durum olabilir -127 ila ,9,223,372,036,854,775,808 bölgesi, hedef mimarinize bağlı olarak ) kodunuzda ne olacak?

Ancak, bir bool kullanıyorsanız, şunun gibi bir şey kullanabilirsiniz:

if(continueBool == true)
  return true;
else
  return false;

Ya da:

return (continueBool== true) ? true : false;

ya da:

return continueBool;

Derleyicinize bağlı olarak, eşlenen doğru / yanlış değerleri depolamak için Bools kullanan kodda gerçekleştirebileceği optimizasyonlar olabilir. Oysa, eşlenen doğru / yanlış değerleri depolamak için kullanılan Int'ler için gerçekleştirebileceği optimizasyonlar olmayabilir.

Ayrıca C ++ 'ın (C, Assembly ve FORTRAN ile birlikte) yüksek verimli, küçük ve hızlı kod yazmak için kullanıldığını hatırlamamız gerekir. Bu nedenle, bu durumda bir Bool kullanmak daha iyi olacaktır - özellikle değişkenleri, belleği, önbelleği veya işlemci zamanını kullanımınız üzerinde işaretlenmişseniz.

Benzer bir soru şudur: neden bir tamsayıyı (değer) bir kayan noktada saklayayım? Cevap: Yapmamalısın, çünkü anlamı yok.

Uzun lafın kısası: Öğretmeniniz / öğretmen / öğretmen / öğretim görevlisi / profesörünüz sizinle birlikte farklı değer türlerinin boyutlarını aşarken (kaçırmış olmanız durumunda) ve Yazılım Geliştirmede neden önemli oldukları hakkında.

İnşallah bir başlangıç ​​noktası olarak yardımcı olur (İnşallah serserilerle karşılaşmamasını da umarım)


4
İf () ödülünün gereksiz kullanımı. Sadece return value >= 0;ilk örnek için yaz.
zvrba

OP'nin sözdizimini anlama seviyesinden emin değildim. Bazen normalden biraz daha ayrıntılı olmasının faydası - özellikle OP bir ödev olduğunu söylediğinden beri
Jamie Taylor

2
Buna katılmamak değil - sadece int üzerinde bir bool seçerek üç bayt tasarrufunun çoğu program için farkedilir bir fark yaratmayacağına işaret etmek. Gerçekten bir performans probleminiz olana kadar verimlilik konusunda endişelenmeyin!
James Anderson

@James: birçok durumda, üç bayttan tasarruf etmeyeceksiniz, çünkü bir sonraki değişken, başka bir bool veya karakter olmadıkça, muhtemelen dört baytlık bir sınırla hizalanacaktır.
JeremyP

1

Buradaki amaç niyetin netliğidir. Dönüş türü, işlevler arabiriminin bir parçasıdır ve işlevden boolne bekleyeceğinizi daha çok anlatır int.

Hatta BOOLdaha anlamlı int, hatta aynı olsa da en azından niyetini gösteriyor.

Ancak bunların hiçbiri benim önerebileceğim şey değil:

enum class UiCmd {QUIT, START_GAME};

-1

Programlamada gerçek hayatta kodlanmış bir şeyi temsil etmek istersiniz. Bir int ve bool aynı şeyi yapmasına rağmen, sübvansiyon fikri tamamen farklıdır: bir bool kullanırken cevap evet olabilir veya olmayabilir; ve hepsi bu, amaç bu. Tamsayılarla , ondalık sayı olmadan miktarları temsil edebilirsiniz. Ve aynı ruhta, bir çift aynı şeyi yapabiliyorken neden bir tamsayı seçtiniz? Sorunu modellerken bir tam sayı iki kattan daha anlamlıysa, bir int seçebilirsiniz.


1
Bu, yaklaşık 6 yıl önce yayınlanan burada en iyi yanıtla yapılmış ve açıklanmış noktalar üzerinde önemli bir şey sunmuyor gibi görünüyor
gnat

-2

Çünkü sonuçta tamsayınızı bir booleya dönüştüreceksiniz: “eğer (i = 1) o zaman başka bir oyun oyna”. Bu durumda (i = 1) doğru veya yanlış: bir boole dönüştürülür.


Hangi makinede çalıştığınıza ve ilgili derleyicilere bağlıdır. IBM ana bilgisayarlarında, "Y" veya "N" olan tek karakterlik bir bayraktan, boolean mantığını uygulamanın en etkili yolu olduğunu öğrenmek sizi şaşırtabilir.
James Anderson

4
Not, if (i = 1)muhtemelen birinin kodunda olması çok yanlış bir şey.
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.