Bool c++, objaśnienie.

Bool c++, objaśnienie.
N2
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 5 lat
  • Postów:17
0

Witam.
Otóż często spotykam,eh raczej słyszę o zmiennej typu bool w C++,jednak problem w tym że mało kto jej używa,a jeszcze mniej się mówi.Ogólnie to moim zdaniem to przydatna jest i logiczna że tak to ujmę.Tylko problem taki że nie rozumiem,jak jej używać itp.Nawet oglądając na yt filmiki o C++,to facet używał funkcji sprawdzającej coś tam o funkcji kwadratowej,nie pamiętam dokładnie i powiedział że można także użyć bool jako funkcja typu bool.Dlatego mam prośbę do was,wytłumaczcie mi łopatologicznie o tym bool'u,jak używać.Jakiś prosty przykład dajcie,np jeśli liczba jakaś tam dzieli się i nie ma reszty to zwróci true bądź false.No wiadomo.

AK
Jesteś oswojony w stosownych częściach matematyki? logika matematyczna, plus teoria zbiorów (mnogości) To wazny podkład.
lion137
@Sunnydev: Czemu "???", stosowna uwaga.
Sunnydev
@lion137: zastanawiam się po co wytaczać takie wielkie działa dla użytkownika, który po prostu chce poznać use-case dla boola. Imho to overkill. Napisałem ???, bo chciałbym się dowiedzieć co by dały autorowi w jego sytuacji te podkłady.
AK
Moja szybka odp (dla @Sunnydev ) to negacja koniunkcji czy alternatywy (z logiki) czy uściślenie kryteriów - zmniejszenie zbioru (z pogranicza teorii mnogości)
katakrowa
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 2 lata
  • Lokalizacja:Chorzów
  • Postów:1670
2

To są na sieci filmiki o zmiennej typu BOOL ? Możesz podesłać ?

Odpowiadając na pytanie ..
Zmienna typu bool może przyjmować wartości logiczne prawda lub fałsz.
Koniec wykładu.

Więcej oraz przykłady: https://pl.wikipedia.org/wiki/Logiczny_typ_danych


Projektowanie i programowanie. Hobbystycznie elektronika i audio oszołom.
edytowany 1x, ostatnio: katakrowa
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 9 godzin
  • Postów:4936
4

Przeczytaj to:
https://www.geeksforgeeks.org/bool-data-type-in-c/
I Obejrzyj to:

Jak czegoś nie Rozumiesz to Wróć tutaj.
Traktuj bool jako subtyp integera (bo jest subtypem integera :) ), przyjmujący tylko dwie wartości 0, 1. Wszedzie gdzie C++ spodziewa sie zmiennej logicznej, for, if, while... (true/false, 1/0) jeden daje prawdę, a zero fałsz.


edytowany 4x, ostatnio: lion137
N2
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 5 lat
  • Postów:17
0

A jak często używać bool'a oraz w jakiego typu operacjach?

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 9 godzin
  • Postów:4936
0

OMG! Najlepiej w ogóle :), żart, ale każdy if mnoży ilość testów razy dwa.
Używasz, po prostu, wtedy gdy jest Ci potrzebny, w konstrukcjach, które go wymagają; warty odnotowania przykład: if - jeżeli, jeżeli warunek w nawiasie jest prawdziwy (true/1), to wykonuj to (po warunku), a jeśli fałśzywy, wykonuj po else.


Zobacz pozostałe 2 komentarze
Azarien
przykładowo cout << (int)true zawsze daje 1. bool b = (bool)2; cout << (int)b; też daje 1.
_13th_Dragon
if(100) cout<<"To nie 1 wiec ma byc false?"
Azarien
ty rozumiesz co napisałem? wartości różne od true i różne od false są traktowane jak true.
_13th_Dragon
Boś się uparł na konwersji w jedną stronę: bool -> int -> x?1:0 Zaś ja mówię o: T -> bool -> T!=0 (gdzie T jest typem liczbowym lub wskaźnikiem)
Azarien
przecież opisałem konwersję w obie strony. co nie zmienia faktu że liczbową (int) wartością true jest zawsze 1.
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
2
nicku2332 napisał(a):

A jak często używać bool'a oraz w jakiego typu operacjach?

Do każdej gdzie sens jest tak/nie.

Świat C/C++ ma to nieszczęście, że długo bool nie było, robiło się jakieś #define FALSE 0 *) itd, a kompilator nie sprawdzał typów (dodawanie 'Tak' do 'pomarańcz', prawda że trudno w tym doszukać się sensu?).
DUUUŻO kiepskiego kodu w związku z tym istnieje.

Nowsze standardy najpierw wprowadziły bool, jeszcze nie egzekwowany siłą, potem próby rozwodu bool z wyrażeniami (nigdy nie do końca zrealizowane, bo utrata kompatybilności itd). Nowsze języki C# czy Java mają bool, którego nie da się mieszać z liczbami.

*) widziałem też polski komercyjny kod z #define TRUE 0, normalnie nagroda Darwina


Bo C to najlepszy język, każdy uczeń ci to powie
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 9 godzin
  • Postów:4936
0

widziałem też polski komercyjny kod z #define TRUE 0, normalnie nagroda Darwina

Nie, nie, nieeeeeeee! Nie Widziałeś tego prawda? Taki żart tylko, proszę... :)


AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
0
lion137 napisał(a):

widziałem też polski komercyjny kod z #define TRUE 0, normalnie nagroda Darwina

Nie, nie, nieeeeeeee! Nie Widziałeś tego prawda? Taki żart tylko, proszę... :)

Widziałem, pierwsza połowa lat 1990, FALSE jak się łatwo domyślić 1


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:około 9 godzin
  • Postów:4936
0

Widziałem, pierwsza połowa lat 1990

A, to OK, wtedy nie takie rzeczy się działy :)


AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
0

Przykład negatywny (jak to jest spieprzone w c/c++, wymienność bool / wyrażenia) masz tutaj, pierwsza funcja bool

https://4programmers.net/Forum/C_i_C++/336281-problem_z_sortowaniem_struktury?p=1654037#id1654037


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 1x, ostatnio: AnyKtokolwiek
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 4 godziny
2

#define TRUE 1
#define FALSE 0

— to jeszcze nie jest takie złe, i miało sens gdy nie było osobnego typu bool.
prawdziwy problem jest w przypadku starych funkcji zwracających 0 w znaczeniu "sukces" a inną wartość jako kod błędu, i później traktowania tego inta jako wartości logicznej. powstają absurdy tego typu:

Kopiuj
// antywzorzec
if (!foobar())
{
    // foobar OK
}
Kopiuj
// prawidłowe wywołanie
if (foobar() == 0)
{
    // foobar OK
}
Kopiuj
// jeszcze lepiej
#define FOOBAR_OK 0
...
if (foobar() == FOOBAR_OK)
{
    // foobar OK
}

nawet w standardzie mamy funkcję strcmp zwracającą 0 gdy stringi są jednakowe. to nawet ma pewien sens w tym przypadku, ale potem spotyka się kod:

Kopiuj
// antywzorzec
if (!strcmp(s, "ala"))
{
    // stringi są jednakowe
}
Kopiuj
// prawidłowe wywołanie
if (strcmp(s, "ala") == 0)
{
    // stringi są jednakowe
}
AnyKtokolwiek napisał(a):

Przykład negatywny (jak to jest spieprzone w c/c++, wymienność bool / wyrażenia) masz tutaj, pierwsza funcja bool

wystarczy nie traktować jako bool intów które konceptualnie nie są wartością logiczną, tylko trzymać się tego że są intami.

edytowany 1x, ostatnio: Azarien
AK
1. strcmp() nie jest funkcją sukces / error, tylko mniejsze/zero/większe, ale to wiesz
AK
2. W moim patrzeniu na programowanie język = ekosystem, tj sam język, bibloteka std, wzorce, konwencje, NAWYKI, przekaz "międzypokoleniowy" itd..
_13th_Dragon
  • Rejestracja:prawie 20 lat
  • Ostatnio:10 dni
0

strcmp zwraca wynik porównania, to samo co operator <=> więc to nie jest najlepszy przykład problemów z wywołaniem.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
Zobacz pozostałe 7 komentarzy
AK
@Azarien: popieram. Jak najdalej od utożsamienia wyrażeń int z bool. Sens 'bool' ma uderzać na pierwszy rzut oka. Te mikroptymalizacje przestały mieć sens już w latach 1990
_13th_Dragon
Po to się robią takiego rodzaju funkcje aby zwykły tępy koder nawet tam nie miał prawa zajrzeć zaś doświadczony szybciej przeczyta !... niż 0==...
AK
dzięki za słowa o "tępym koderze", to dobrze oddaje podkład psychologiczny pod pseudohackimgiem.
_13th_Dragon
Czyste doświadczenie, albo nie dopuszczasz pewnej grupy współpracowników do pewnej części kodu, albo tracisz mnóstwo czasu na takie właśnie kwiatki if(strcmp(...)) gdzie koder miał na myśli jeżeli takie same i temu podobne. Myślę że jest tu podkład psychologiczny, po sumarycznym spędzeniu w okolice pół roku na odnalezienie podobnych kwiatków - zwyczajnie mam dość, dla tego przeważnie zamykam część kodu od niedoświadczonych. Jak od ciebie zamykają część kodu to zwyczajnie się nie przejmuj, nie ma tu żadnych pseudo ani żadnego zadufania, zwyczajnie ktoś nie chce ...
_13th_Dragon
... siedzieć po nocach aby odnaleźć popełnionego przez ciebie byka.
Szalony Programista
Szalony Programista
  • Rejestracja:około 7 lat
  • Ostatnio:około 4 lata
  • Postów:227
0

Zwykła matematyczna logika, możesz za pomocą niej zrobić wszystko, od odbiorników szerokopasmowych, demodulatory, własną stację radiową, cpu.

Np. takiego ifa można prosto zaimplementować logicznie:

Kopiuj
!(strcmp(a, b) || !printf("==")) || printf("<>");

Logikę skracasz podobnie do zwykłych operacji arytmetycznych:

Kopiuj
2 * 3 + 2 * 4    ==   2 * ( 3 + 4)

Tyle że wykorzystując logiczne operatory

Kopiuj
(a && b) || (a && c)   ==    a && ( b || c) 

Redukujesz tym samym ilość tranzystorów potrzebnych do danej operacji.
jedna operacja to 2 tranzystory AND/ OR, lecz się stosuje NAND/NOR
I np. z 6 redukujesz do 4 tranzystorów, skracając równanie.

Komputer traktuje wszystko inne od zera jako logiczne TRUE, a równe zero FALSE.
printf funkcja zwraca liczbę wyświetlonych znaków, czyli jest TRUE z negacją jest FALSE.

Musisz trochę po analizować, wykonać jakieś przykłady wtedy najlepiej zrozumiesz.

Masz jeszcze operatory bitowe, też logiczne, ale na bitach, a nie na całych rejestrach, chodź można do tego też ich użyć.
A logika zwykła operuje na całych rejestrach dlatego, wszystko różne od zera jest TRUE, a jak jest równe zero to FALSE.

edytowany 1x, ostatnio: Szalony Programista
AK
  • Rejestracja:prawie 7 lat
  • Ostatnio:około miesiąc
  • Postów:3561
1
Szalony Programista napisał(a):

Zwykła matematyczna logika, możesz za pomocą niej zrobić wszystko, od odbiorników szerokopasmowych, demodulatory, własną stację radiową, cpu.

Np. takiego ifa można prosto zaimplementować logicznie:

Kopiuj
!(strcmp(a, b) || !printf("==")) || printf("<>");

Logikę skracasz podobnie do zwykłych operacji arytmetycznych:

Kopiuj
2 * 3 + 2 * 4    ==   2 * ( 3 + 4)

Tyle że wykorzystując logiczne operatory

Kopiuj
2 && 3 || 2 && 4   ==    2 & ( 3 || 4) 

Redukujesz tym samym ilość tranzystorów potrzebnych do danej operacji.
jedna operacja to 2 tranzystory AND/ OR, lecz się stosuje NAND/NOR
I np. z 6 redukujesz do 4 tranzystorów, skracając równanie.

Komputer traktuje wszystko inne od zera jako logiczne TRUE, a równe zero FALSE.
printf funkcja zwraca liczbę wyświetlonych znaków, czyli jest TRUE z negacją jest FALSE.

Musisz trochę po analizować, wykonać jakieś przykłady wtedy najlepiej zrozumiesz.

Masz jeszcze operatory bitowe, też logiczne, ale na bitach, a nie na całych rejestrach, chodź można do tego też ich użyć.
A logika zwykła operuje na całych rejestrach dlatego, wszystko różne od zera jest TRUE, a jak jest równe zero to FALSE.

Moża, ale czy należy? To **pseudohacking **nic nie dający w realnym życiu (fragment o optymalizacji w elektronice jest OK. Tranzystor kosztuje 'jakąś' kwotę)

2 && 3 || 2 && 4 == 2 & ( 3 || 4)
Sam się zakalapućkałeś, znajdź.
Przy czym ten pseudohackerski kod wyleci w powietrze jak kiedyś true stanie się bezwarunkowo jedynką.

Cały post jest na temat "jak to źle jest zrealizowane w C/C++", dziękuję za przykłady do mojej tezy

Zwykła matematyczna logika, możesz za pomocą niej zrobić wszystko, od odbiorników szerokopasmowych, demodulatory, własną stację radiową, cpu.

Obawiam się, że elektronika nie jest Twoją mocną stroną, choć płynnie jak dziennikarze udajesz, że jesteś w temacie


Bo C to najlepszy język, każdy uczeń ci to powie
edytowany 3x, ostatnio: AnyKtokolwiek
Zobacz pozostały 1 komentarz
AK
nawet nie rozumiesz w czym problem. Zanim udowodnisz tą tożsamość, to wypisz ołówkiem co jest wartościowane.
Szalony Programista
Szalony Programista
Po twojej wypowiedzi widzę, że nadepnąłem ci na odcisk. Z tym ifem, podałem skrajny przypadek, ale dość ciekawy, normalnie if jest na jumpach robiony. Chciałem zachęcić do korzystania z logiki i poznania jej, dla mnie się wydaje bardzo interesująca i nie jest jakoś super trudna.
AK
To może objaśnij Kolego twoją teorię odnośnie jumpów a może ich braku, bo ja z ciemnego ludu i nie pojmuję
Szalony Programista
Szalony Programista
To wynika z kodu maszynowego ifa, jeśli wartość jest zero je(jump if equal) przeskakuje kod, a potem przeskakuje do else jmp bezwarunkowym skokiem, w przeciwnym wypadku nie przeskakuje przy JE, ale na koniec kodu jest jump bezwarunkowy, który przeskakuje elsa. https://godbolt.org/z/jiFfVP
AK
Serio? I w czym jest praktyczne znaczenie tychże różnic?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.