Mieliśmy zadanie dla naszej klasy, w którym musieliśmy stworzyć grę w kółko i krzyżyk . Ludzie lubią się komplikować, więc pisali skomplikowane gry zawierające menu. Pod koniec gry trzeba było ponownie zagrać lub wyjść z programu. Użyłem do tego int
zmiennej, ale zauważyłem, że niektórzy koledzy z klasy używają BOOL-ów.
Czy to jest bardziej wydajne? Jaka jest różnica między przechowywaniem odpowiedzi, która powinna przechowywać tylko dwie wartości, int
a nie przechowywaniem w bool? Jaki jest dokładny cel tych zmiennych?
int
jest przechowanie liczby całkowitej, a celembool
jest przechowanie wartości logicznej (true
lubfalse
). Korzystanie zbool
IMO znacznie lepiej odzwierciedla jego wykorzystanie niż używanieint
.typedef int Bool
w celu wyjaśnienia, że używają wartości logicznej. C ++ zintegrowało obsługębool
języka, podobnie jak C99 ze (raczej brzydkim)_Bool
słowem kluczowym.bool
”, chodzi o to, dlaczego mamy różne nazwy dla podobnych typów (jaklength_t
) i dlaczego ważne jest, aby kompilator sprawdzał typy.Odpowiedzi:
Wybierając typy zmiennych i nazwy zmiennych, chcesz, aby Twoje zamiary były tak jasne, jak to możliwe. Jeśli wybierzesz
bool
typ (boolean), jasne jest, że istnieją tylko dwie dopuszczalne wartości:true
lubfalse
. Jeśli użyjesz typuint
(liczba całkowita), nie jest już jasne, że intencją tej zmiennej może być tylko 1 lub 0 lub dowolne wartości, które chcesz oznaczaćtrue
ifalse
. Plussizeof(int)
zwykle zwraca 4 bajty, podczas gdysizeof(bool)
zwraca 1.źródło
Wydaje się we wszystkich (do teraz) gromadzone odpowiedzi nikt nie złapał fakt, że OP mówił o
BOOL
niebool
.Ponieważ pytanie jest oznaczone jako C ++, należy zauważyć, że:
int
jest liczbą całkowitą, która waha się od makrINT_MIN
doINT_MAX
- zdefiniowanych,<climits>
których wartości zależą od architektury komputera hostującego. W C ++ wartości te są również dostępne odpowiedniostd::numeric_limits<int>::min()
i...:max()
). Zachowanie operatorów logicznych zastosowane doint
traktowania0
jako fałszywe, a wszystko inne jako prawdziwe .BOOL
jest tylko wskazówką sugerującą zachowanie typu boolean dla int. Jest zdefiniowany<cstddef>
jakoBOOL
jest więc niczym więcej niż cukrem syntaktycznym, bo tym, co - według kompilatora - jest niczym więcej niż int. Jest to coś, czego używają programiści C, ale programiści C ++ powinni unikać, ponieważ C ++ mabool
.bool
jest typem integralnym języka, którego obsługiwane wartości to justtrue
ifalse
. Po przekształceniuint
true
staje się 1 ifalse
staje się 0.Ważnym aspektem jest to, że jest bardziej bezpieczny przed błędami programowania:
niemożliwe jest kodowanie odpowiednim typem bool:
Używanie
BOOL
zamiastbool
jest tylko złym nawykiem odziedziczonym po chwalebnej przeszłości, którego nikt tak naprawdę nie jest w stanie zapomnieć, tworząc stary problem dla mniej chwalebnego jutra.Nauczyciele języka powinni poważnie o tym pomyśleć!
źródło
Typy bool są mniejsze niż typy Int, dlatego zajmują mniej miejsca w pamięci. W zależności od systemu, w którym kompilujesz / dla, liczba Int może wynosić 4–8 bajtów, podczas gdy wartość Bool to 1 bajt (jak widać w tym artykule MSDN )
Połącz to z niektórymi aspektami KISS i dobrego projektu programu, i staje się oczywiste, dlaczego lepiej jest używać bool do przechowywania zmiennej, która będzie miała tylko 2 wartości.
Po co nadmiernie komplikować rzeczy za pomocą obiektu, który może przechowywać szeroki zakres wartości, skoro masz pewność, że zawsze musisz przechowywać tylko 1 z 2 różnych wartości?
Co dzieje się w systemie, który używa int, jeśli przechowujesz w nim 75? Jeśli dodano dodatkowe warunki warunkowe
lub
wtedy jesteś objęty tą sytuacją. Ale jeśli nie, to nie jesteś.
Możesz mieć również przypadek (w zależności od tego, jak zmieniasz wartość int), w którym występuje przepełnienie bufora, a wartość „resetuje” z powrotem do 0 lub dolnej granicy int (która może być gdzieś w region od -127 do −9 223 372,036,854,775,808, w zależności od architektury docelowej ). Co dzieje się wtedy w kodzie?
Jeśli jednak użyłeś bool, możesz użyć czegoś takiego:
Lub nawet:
lub nawet:
W zależności od kompilatora mogą istnieć optymalizacje, które może wykonać na kodzie używającym Boolsa do przechowywania mapowanych wartości prawda / fałsz. Chociaż mogą nie istnieć optymalizacje, które może wykonać dla Ints do przechowywania odwzorowanych wartości prawda / fałsz.
Musimy również pamiętać, że C ++ (wraz z C, asemblerem i FORTRAN) służy do pisania bardzo wydajnego, małego i szybkiego kodu. Tak więc lepiej byłoby użyć Bool w tym przypadku - szczególnie jeśli jesteś zaznaczony na podstawie używania zmiennych, pamięci, pamięci podręcznej lub czasu procesora.
Podobne pytanie brzmi: dlaczego miałbym przechowywać liczbę całkowitą (wartość) w liczbach zmiennoprzecinkowych? Odpowiedź: Nie powinieneś, bo nie ma sensu.
Krótko mówiąc: Jako nauczyciel / korepetytor / wykładowca / profesor, aby omówić z tobą rozmiary różnych rodzajów wartości (na wypadek, gdybyś to przegapił) i dlaczego są one ważne w rozwoju oprogramowania.
Mam nadzieję, że to pomoże jako punkt wyjścia (mam również nadzieję, że nie wydaje się to pedantyczne)
źródło
return value >= 0;
dla pierwszego przykładu.Celem jest jasność intencji. Typ zwracany jest częścią interfejsu funkcji, a
bool
mówi więcej o tym, czego można oczekiwać od funkcji niż anint
.Nawet
BOOL
jest bardziej wyrazisty niżint
, chociaż jest tego samego typu, co najmniej pokazuje twoje zamiary.Jednak żaden z nich nie jest tym, co poleciłbym:
źródło
W programowaniu chcesz reprezentować coś z prawdziwego życia w kodzie. Mimo, że int i bool mogą zrobić to samo, podśrodkowa idea jest zupełnie inna: przy użyciu bool odpowiedź może być tak lub nie; i to wszystko, taka jest intencja. Za pomocą liczb całkowitych możesz reprezentować ilości bez kropki dziesiętnej. I w tym samym duchu, dlaczego miałbyś wybierać liczbę całkowitą, kiedy podwójne może zrobić to samo? Jeśli podczas modelowania problemu liczba całkowita ma większy sens niż liczba podwójna, możesz wybrać liczbę całkowitą.
źródło
Ponieważ w końcu i tak zamienisz liczbę całkowitą na wartość logiczną: „jeśli (i = 1), to zagraj w inną grę”. W tej sytuacji (i = 1) jest konwertowany na true lub false: boolean.
źródło
if (i = 1)
prawdopodobnie jest to bardzo niewłaściwa rzecz w kodzie.