C++ a typ bool i standard

0

Witam, ostatnio miałem sprawdzian w technikum i było tam pytanie:
"Czy w C++ rozwiązano problem typu logicznego? Rozwiń myśl"

To napisałem, że wprowadzony został typ bool który może przyjmować wartości true i false. Co nauczycielka stwierdziła, że jest źle bo nie jest to w standardzie i nie wszędzie obsługiwane.

Czy to co powiedziała nauczycielka to prawda?

0

Parę cytatów ze standardu:

2.11 Keywords

  • bool

2.13.5 Boolean literals [lex.bool]
boolean-literal:
false
true
1 The Boolean literals are the keywords false and true. Such literals have type bool. They are not lvalues.

3.9.1 Fundamental types:
6. Values of type bool are either true or false. 42) [Note: there are no signed, unsigned, short, or
long bool types or values. ] As described below, bool values behave as integral types. Values of type
bool participate in integral promotions (4.5).

Chyba wystarczy?

0

W skrócie:

  • W C typu bool nie ma
  • W C++ typ bool jak najbardziej jest i każdy kto twierdzi inaczej powinien zapoznać się ze standardem. Aczkolwiek typ ten nie jest wcale jakiś super, bo zajmuje 1 bajt, czyli znacznie więcej niż faktycznie przechowuje informacji.
0

Aczkolwiek typ ten nie jest wcale jakiś super, bo zajmuje 1 bajt, czyli znacznie więcej niż faktycznie przechowuje informacji.
Wyobrażasz sobie inaczej? Bajt to z definicji najmniejsza komórka pamięci możliwa do zaadresowania, a do zmiennej musi dać się pobrać adres.
Zresztą to ma znaczenie dopiero, gdybyś miał bardzo dużo tych booli. I tu standard przychodzi z pomocą: vector<bool> może, choć nie musi, być zaimplementowany jako trzymający elementy na bitach, a nie bajtach.

Zarówno w C jak i C++ istnieje typ logiczny. Jeśli jakiś kompilator tego nie obsługuje, to to jest wada kompilatora. Bo rozmawiamy o języku, czyli o jego standardzie.
Ale osobny typ bool to tylko część problemu.
Nierozwiązanym problemem jest łatwość pomyłki w wyrażeniach warunkowych:

int a=0; if (a=1) printf("a jest 1\n");

warunek jest zawsze spełniony, a o taki błąd bardzo łatwo.
trudniej o tę pomyłkę w C#, gdzie int nie rzutuje się na bool samoczynnie, więc taki kod nie przejdzie.

0

Okej dzięki Wam i dzięki za cytat ze standardu - będę miał na czym oprzeć moje zdanie.

0
Azarien napisał(a)

Nierozwiązanym problemem jest łatwość pomyłki w wyrażeniach warunkowych:

int a=0; if (a=1) printf("a jest 1\n");

warunek jest zawsze spełniony, a o taki błąd bardzo łatwo.

Natomiast prostym rozwiązaniem na całkowite wyeliminowanie takich błędów jest zapisywanie warunków tak:

int a=0; if (1 = a) printf("a jest 1\n");

1 użytkowników online, w tym zalogowanych: 0, gości: 1