Bool c++, objaśnienie.

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.

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

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.

0

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

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.

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

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ę... :)

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

0

Widziałem, pierwsza połowa lat 1990

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

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

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:

// antywzorzec
if (!foobar())
{
    // foobar OK
}
// prawidłowe wywołanie
if (foobar() == 0)
{
    // foobar OK
}
// 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:

// antywzorzec
if (!strcmp(s, "ala"))
{
    // stringi są jednakowe
}
// 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.

0

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

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:

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

Logikę skracasz podobnie do zwykłych operacji arytmetycznych:

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

Tyle że wykorzystując logiczne operatory

(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.

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:

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

Logikę skracasz podobnie do zwykłych operacji arytmetycznych:

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

Tyle że wykorzystując logiczne operatory

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

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