Bool c++, objaśnienie.

Bool c++, objaśnienie.
N2
  • Rejestracja:ponad 5 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:około 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:4 minuty
  • Postów:4884
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:ponad 5 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:4 minuty
  • Postów:4884
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:ponad 6 lat
  • Ostatnio:około rok
  • 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:4 minuty
  • Postów:4884
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:ponad 6 lat
  • Ostatnio:około rok
  • 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:4 minuty
  • Postów:4884
0

Widziałem, pierwsza połowa lat 1990

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


AK
  • Rejestracja:ponad 6 lat
  • Ostatnio:około rok
  • 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:minuta
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:ponad 19 lat
  • Ostatnio:2 miesiące
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:prawie 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:ponad 6 lat
  • Ostatnio:około rok
  • 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?
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)