Dzwon.

Są ci, którzy przeczytali tę wiadomość przed tobą.
Subskrybuj odbieranie artykułów świeżych.
E-mail
Nazwa
Nazwisko
Jak chcesz przeczytać dzwonek
Bez spamu

Ponieważ w poprzednim artykule po raz pierwszy użyłem logicznej operacji, powiem ci, czym są, ile i jak ich używają.

W C ++ są trzy operacje logiczne:

  1. Obsługa logiczna i &&, jesteśmy już znani;
  2. Obsługa logiki lub. || ;
  3. Obsługa logiki NE. ! lub zaprzeczenie logiczne.

Operacje logiczne tworzą kompleks (kompozytowy) z kilku prostych (dwóch lub więcej) warunków. Operacje te kilka razy upraszczają strukturę kodu programu. Tak, możesz zrobić bez nich, ale następnie liczba IFO wzrasta kilka razy, w zależności od stanu. Poniższa tabela krótko opisała wszystkie operacje logiczne w języku programowania C ++, aby zbudować warunki logiczne.

Teraz powinieneś zrozumieć różnicę między operacją logiczną a logalną działaniem lub aby nie być mylone. Nadszedł czas, aby zapoznać się z typem danych Bool. -Logika. Ten typ danych może zająć dwie wartości: true (prawda) i fałsz. Warunek sprawdzony w operatorach wyboru ma typ danych Bool. Rozważ zasadę działania następnego programu, a wszystko będzie zrozumiałe dla wszystkich tych logicznych operacji.

// lub_and_not.cpp: Określa punkt wejściowy dla aplikacji konsoli. #Include "stdafx.h" #include Za pomocą przestrzeni nazw STD; Int Main (int Argc, Char * Argv) (Bool A1 \u003d true, A2 \u003d false; // ogłoszenie zmiennych logicznych Bool A3 \u003d True, A4 \u003d False; Cout<< "Tablica istinnosti log operacii &&" << endl; cout << "true && false: " << (a1 && a2) << endl // логическое И << "false && true: " << (a2 && a1) << endl << "true && true: " << (a1 && a3) << endl << "false && false: " << (a2 && a4) << endl; cout << "Tablica istinnosti log operacii ||" << endl; cout << "true || false: " << (a1 || a2) << endl // логическое ИЛИ << "false || true: " << (a2 || a1) << endl << "true || true: " << (a1 || a3) << endl << "false || false: " << (a2 || a4) << endl; cout << "Tablica istinnosti log operacii !" << endl; cout << "!true: " << (! a1) << endl // логическое НЕ << "!false: "<< (! a2) << endl; system("pause"); return 0; }

Wiersze 9 i 10 Musisz być zrozumiany, ponieważ typ zmiennych jest tutaj inicjowany. Bool. . A każda zmienna jest przypisana wartość Prawda czy fałsz. Zaczynając od 9 rzędu I wykończenie 20-y.Wyświetlana jest użycie operacji logicznych. Wynik programu (patrz rysunek 1).

Tablica Istinnosti dziennika operacii && && prawda fałsz: 0 false && Prawda: 0 Prawdziwa && Prawda: 1 && Fałsz Fałsz: 0 Tablica Istinnosti dziennika Operacii || Prawda || FAŁSZ: 1 FALSE || Prawda: 1 True || PRAWDA: 1 FAŁSZ || FAŁSZ: 0 Tablica Istinnosti Log OPERACIII! ! Prawda: 0! Fałsz: 1 Aby kontynuować, naciśnij dowolny klawisz. . .

Rysunek 1 - Operacje logiczne C ++

Prawdopodobnie masz pytanie: "Jakie są ci testerzy i jednostki?". Jeśli jest pytanie, musisz odpowiedzieć. Odpowiedz: "Nolik jest reprezentacją logicznej wartości fałszywych (kłamstw), ale jednostki są logiczne prawdziwe (prawda)." Krótko wyjaśnij kilka chwil. Stan złożony za pomocą logicznego I Prawda tylko wtedy, gdy zarówno proste warunki są prawdziwe. We wszystkich innych przypadkach warunek kompozytowy jest fałszywy. Stan złożony przy użyciu logicznego lub fałszywie tylko wtedy, gdy fałszywe są proste warunki. We wszystkich innych przypadkach stan kompozytowy jest prawdziwy. Zaprzeczenie logiczne. NIE jest niezmienną obsługą i nie łączy dwóch warunków, w przeciwieństwie do operacji logicznych I i LUBktóre są operacje binarne. Logiczna odmowa pozwala odwrócić znaczenie stanu, w jakich przypadki jest bardzo wygodne. Stan z logicznym zaprzeczeniem jest prawdziwe, jeśli taki sam stan jest fałszywy bez negatywnych, a odwrotnie.

Wszelkie wyrażenie języka składa się z operandów (zmiennych, stałych itp.) Połączony znakami operacji. Znak obsługi jest symbolem lub grupą znaków, które zgłaszają kompilator o potrzebie wykonywania niektórych działań arytmetycznych, logicznych lub innych.

Operacje są wykonywane w surowej sekwencji. Wartość, która określa prawo prewencyjne do wykonania określonej operacji nazywa się priorytetem. W zakładce. 2 Wymieniono różne operacje języka SI (C). Ich priorytety dla każdej grupy są takie same (grupy są podświetlone w kolorze). Większa korzyść używana jest odpowiednia grupa operacji, tym wyższa jest umieszczona w tabeli. Procedura operacji wykonywania może być regulowana za pomocą nawiasów.

Tabela 2 - Operacje

Znak operacji

Cel operacji

Funkcja wywołania

Alokacja elementu tablicy

Wybór elementu wejścia

Wybór elementu wejścia

Zaprzeczenie logiczne.

Digital Denial.

Zmiana znaku

Równość na jednostkę.

Redukcja przez jednostkę.

Podejmowanie adresu

Odwołanie do adresu

Konwersja typu (tj. (Float) A)

Określanie rozmiaru w bajtach

Mnożenie

Określenie salda

Dodanie

Odejmowanie

Przesunięcie w lewo.

Przesuń w prawo

Mniej niż

Mniej lub równe

Więcej niż

Więcej lub równe

Logika pożyczki "i"

Cyfra z wyłączeniem "lub"

Logika pożyczki "lub"

Logiczne "i"

Logiczny "lub"

Obsługa warunkowego (ternar)

Zadanie

+=, - =, *=, /=, %=, <<=,
>>=, &=, |=, ^=

Operacje binarne (na przykład A * \u003d b
(tj. a \u003d a * b) itd.)

Przecinek pracy

Operator w Si (C)

Aby wykluczyć nieporozumienia w koncepcjach „Operation” i „Operator”, możemy zauważyć, że operator jest najmniejszą jednostką wykonywalny programu. Operatorzy ekspresji wyróżniają, którego działanie polega na obliczaniu określonych wyrażeń (na przykład a \u003d sin (B) i C j ++), operatorzy ad operatorzy kompozytowe, puste operatorzy operatorzy etykiet, cykl itp . Aby odnosić się do końca operatora w języku SI (C), stosuje się punkt. Jeśli chodzi o operatora kompozytowego (lub bloku), który jest zestawem logicznie powiązanych operatorów umieszczonych między nawiasami kręconymi otwierającymi (() a zamykającymi ()) ("Wsporniki operatora"), wówczas punkt z przecinkiem nie jest umieszczony. Zauważ, że blok różni się od operatora kompozytowego przez obecność definicji w treści bloku.

Charakterystyka głównych operacji języka SI (C)

Charakteryzujemy podstawowe operacje języka SI (C).

Operacja przypisania

Najpierw rozważ jedną z nich - operacja przypisania (\u003d). Wyraz typu

przypisuje zmienną wartość X zmiennej Y. Operacja "\u003d" może używać wiele razy w jednym wyrażeniu, na przykład:

x \u003d y \u003d z \u003d 100;

Odróżnić operacje bezary i binarne. W pierwszym z nich jeden operand i drugi - dwa. Rozpocznijmy rozważanie od operacji związanych z pierwszym z następujących tradycyjnych grup:

Działania arytmetyczne.

Operacje logiczne i relacje relacji.

Operacje z bitami.

Operacje arytmetyczne są ustawiane przez następujące symbole (tabela 2): +, -, *, /,%. Ostatni nie można zastosować do zmiennej typu rzeczywistego. Na przykład:

a \u003d B + C;
x \u003d y - z;
R \u003d t * v;
s \u003d k / l;
P \u003d q% w;

Operacje logiczne.

Operacje relacji logicznych są ustawiane przez następujące symbole (patrz tabela 2): && ("i"), || ("Lub"),! ("Nie"),\u003e,\u003e \u003d,<, <= , = = (равно), != (не равно). Традиционно эти операции должны давать одно из двух значений: истину или ложь. В языке СИ (C)принято следующее правило: истина - это любое ненулевое значение; ложь - это нулевое значение. Выражения, использующие логические операции и операции отношения, возвращают 0 для ложного значения и 1 для истинного. Ниже приводится таблица истинности для логических операций.

Operacje bitowe mogą być stosowane do zmiennych, które mają INT, typy char, jak również ich warianty (na przykład LONG INT). Nie można ich stosować do zmiennych typów pływaków, podwójnych, nieważnych (lub więcej typów złożonych). Te operacje są ustawiane przez następujące symbole: ~ (odmowa bonnetalna),<< (сдвиг влево), >\u003e (Przesuń w prawo), & (Bonnet "i"), ^ (bitów z wyłączeniem "lub"), | (Cyfra "lub").

Przykłady: jeśli A \u003d 0000 1111 i B \u003d 1000 1000, a następnie

~ A \u003d 1111 0000,
ZA.<< 1 = 0001 1110,
A \u003e\u003e 1 \u003d 0000 0111,
A & B \u003d 0000 1000,
a ^ b \u003d 1000 0111,
a |. B \u003d 1000 1111.

Język zapewnia dwie nietradycyjne operacje przyrostowe (++) i zmniejszenie (-). Są one zaprojektowane, aby zwiększyć i zmniejszyć wartość operanda. Operacja ++ i - może być rejestrowana zarówno przed operanami, jak i po nim. W pierwszym przypadku (++ N lub --N), wartość operanda (n) zmienia się przed jego użyciem w odpowiednim wyrażeniu, aw drugim (N ++ lub N--) - po jego użyciu. Rozważ następujące dwa rzędy programu:

a \u003d B + C ++;
A1 \u003d B1 +++ C1;

Załóżmy, że B \u003d B1 \u003d 2, C \u003d C1 \u003d 4. Następnie po wykonaniu operacji: A \u003d 6 B \u003d 2, c \u003d 5, A1 \u003d 7, B1 \u003d 2, C1 \u003d 5.

Wyrażenia z inną nietradycyjną terralizacją lub warunkową działaniem są rozpowszechnione. W formule.

y \u003d A, jeśli X jest zero (czyli prawdziwy), a Y \u003d B, gdy x ma wartość zero (fałsz). Następny wyrażenie

y \u003d (A\u003e b)? A: B;

umożliwia przypisanie zmiennej wartości większej zmiennej (A lub B), tj. y \u003d max (A, b).

Kolejnym rozróżnieniem języka jest to, że wyrażenie formularza A \u003d A + 5; może być napisany w innej formie: A + \u003d 5; Zamiast znaku + możesz użyć symboli innych operacji binarnych (patrz tabela 2).

Inne operacje tabeli. 2 zostanie opisany w kolejnych akapitach.

Cykle organizowane są do wykonywania niektórych operatorów lub grupy operatorów pewnej liczby razy. W języku SI (C), trzy operatory cyklu: dla, podczas gdy i robić - podczas gdy. Pierwszy z nich jest formalnie napisany, w następującym formularzu:

dla (wyrażenie_1; wyrażenie_2; wyrażenie_3) body_tsikla

Ciało cykl albo jeden operator lub kilku operatorów wewnątrz nawiasów klamrowych (...) (po punkcie bloku z przecinkiem nie znajduje się). W wyrażeniach 1, 2, 3 pojawia się specjalna zmienna zwana kontrola. Według jego wartości konieczność powtórzenia cyklu lub wyjścia jest z niego ustanowiona.

Expression_1 przypisuje wartość początkową zmiennej sterowania, wyrażenie_S zmienia ją na każdym kroku, a wyrażenia_2 sprawdza, czy osiągnął wartość graniczną, która ustanawia potrzebę wyjścia z cyklu.

dla (i \u003d 1; ja< 10; i++)

dla (Сh \u003d "A"; CH! \u003d "P";) SCANF ("% C", & CH);

/ * Cykl zostanie wykonany do klawiatury

symbol "P" * /

Każda z trzech wyrażeń w cyklu może być nieobecna, jednak punkt z przecinkiem powinien pozostać. Tak więc dla (;;) (...) jest nieskończonym cyklem, z którego można wyjść tylko na inne sposoby.

W języku SI (C) podjęte jest następująca zasada. Każde wyrażenie z działaniem przypisywania w nawiasach jest równe przypisywane. Na przykład, wyrażenie (A \u003d 7 + 2) wynosi 9. Następnie możesz napisać inną ekspresję, na przykład: ((A \u003d 7 + 2)<10), которое в данном случае будет всегда давать истинное значение. Следующая конструкция:

((Sh \u003d getch ()) \u003d\u003d "i")

umożliwia wprowadzenie wartości zmiennej CH i dać prawdziwy wynik tylko wtedy, gdy wprowadzona wartość jest literą "I". W nawiasach można nagrywać kilka formuł stanowiących złożoną ekspresję. W tych celach stosuje się operacja przecinkowa. Wzory zostaną obliczone od lewej do prawej, a wszystkie wyrażenie przyniesie wartość ostatniej obliczonej formuły. Na przykład, jeśli istnieją dwie zmienne typu Char, a następnie wyrażenie

z \u003d (x \u003d y, y \u003d getch ());

określa następujące działania: wartość zmiennej Y jest przypisana do zmiennej X; Symbol z klawiatury jest wprowadzany i przypisany do zmiennej Y; Z otrzymuje wartość zmiennej Y. Nawiasy są tutaj potrzebne, ponieważ operacja przecinkowa ma niższy priorytet niż operacja przypisania zarejestrowana po zmiennej Z. Operacja przecinek jest szeroko stosowany do budowania wyrażeń cyklu przez i pozwala jednocześnie zmienić wartości kilku zmiennych kontrolnych.

Inwestowane struktury są dozwolone, tj. W ciele niektórych cyklu mogą wystąpić inne dla operatorów.

Podczas gdy instrukcja jest formalnie napisana w tym formularzu:

podczas gdy (wyrażenie) body_tsikla

Wyrażenie w nawiasach może wziąć wartość niezerową (prawda) lub zero (false)). Jeśli jest naprawdę, wykonany jest korpus cyklu, a wyrażenie jest ponownie obliczane. Jeśli wyrażenie jest fałszywe, a jednocześnie kończy się cykl.

Oświadczenie o robotach jest formalnie napisane w następujący sposób:

robić (body_cyklla) podczas (ekspresja);

Główna różnica między trwaniem i do zrobienia - podczas gdy cykle polega na tym, że ciało w to - podczas gdy cykl jest wykonywany co najmniej raz. Korpus cyklu zostanie wykonany, aż wyrażenie w nawiasach podejmie fałszywa wartość. Jeśli jest ona fałszywa przy wejściu do cyklu, jego ciało jest wykonywane dokładnie raz.

Dozwolone jest zagnieżdżanie niektórych cykli do innych, tj. W ciele każdego cyklu, operatorów, podczas gdy może się pojawić.

W ciele cyklu można użyć nowej przerwy i kontynuacji operatorów. Operator przerwy zapewnia natychmiastową wydajność z cyklu, kontynuacja operatora powoduje zakończenie następnego i początku następnej iteracji.

Warunkowe i bezwarunkowe operatorzy przejściowe

Aby zorganizować warunkowe i bezwarunkowe przejścia w programie SI (C) (C), wykorzystywane są operatorzy: jeśli - inaczej, przełącznik i goto. Pierwszy jest napisany w następujący sposób:

jeśli (Check_Linking) Operator_1; Inaczej operator_2;

Jeśli warunek w nawiasach podejmuje prawdziwą wartość, operator_1 jest wykonywany, jeśli fałszywy operator_2. Jeśli zamiast tego musisz wykonać kilku operatorów, są one kręconymi szelkami. W instrukcji IF, słowo może być nieobecne.

W IF - inaczej stwierdzenie bezpośrednio po IF I inaczej słowa kluczowe muszą przestrzegać innych operatorów. Jeśli przynajmniej jeden z nich jest operatorem, nazywa się zainwestowany. Zgodnie z umową przyjętą w porozumieniu SI (C), słowo inaczej zawsze odnosi się do najbliższej, jeśli wcześniej.

Operator przełącznika pozwala wybrać jedną z kilku alternatyw. Jest napisany w następującej formalnej formie:

przełącznik (wyrażenie)

cASE CONSTANTA_1: Operatorzy_1;

cASE CONSTANTA_2: Operatorzy_2;

........ ........

domyślnie: operatorzy_Default;

Tutaj obliczana jest wartość całego wyrażenia w nawiasach (czasami nazywana jest wybierakiem) i jest porównywany ze wszystkimi stałymi (ciągłe wyrażenia). Wszystkie stałe muszą być różne. Podczas dopasowywania, odpowiednia wersja operatorów (jeden lub więcej operatorów) jest wykonywana. Opcja z domyślną domyślną słowem klucza jest zaimplementowana, jeśli żaden inny się nie zbliżył (może brakować słów). Jeśli domyślny jest nieobecny, a wszystkie wyniki porównania są ujemne, nie jest wykonywana żadna opcja.

Aby zatrzymać następujące kontrole Po udanym wyborze niektórych opcji, używany jest operator przerwy, zapewniając natychmiastową wyjście z przełącznika przełącznika.

Zainwestowane projekty przełączników.

Rozważmy zasady wykonywania bezwarunkowego przejścia, które można złożyć w następującym formularzu:

etykieta goto;

Etykieta jest dowolnym identyfikatorem, po którym dostarczany jest dwukropek. Operator Goto wskazuje, że program musi być kontynuowany od operatora, w którym etykieta zostanie zapisana. Etykieta może być umieszczona przed dowolnym operatorem w funkcji, w której operator GOTO odpowiada go. Nie należy go ogłosić.

Turbo Debuger w pełni obsługuje składnię wyrażeń Si (C). Wyrażenie składa się z mieszaniny operacji, ciągów, zmiennych

Tagi: Si operatory logiczne, logiczne zaprzeczenie logiczne, nie,!, Logiczne lub logiczny dodatek, OR, logiczne, logiczne i mnożenie, a procedura wykonywania operatorów logicznych

Operatorzy logicznych.

L OGIC Instrukcje są operatorzy, które akceptują wartości logiczne jako argumenty (fałsz lub prawda) i zwracają wartość logiczną. Podobnie jak zwykłych operatorów, mogą być singlem (UNELARY, tj. Weź jeden argument), dwuwymiarowe (binarne, biorąc dwa argumenty), drobiazgi itp.

Cechą języka SI jest to, że nie ma typu, który przechowuje wartość boolowską (fałsz lub prawda). W podnoszeniu (logiczny zero) rozważa się liczba całkowita 0, a każda niezerowa całość będzie prawdą logiczną. na przykład

#Zawierać. #Zawierać. nieważne główne () (char bovalue \u003d -71; jeśli (bovalue) ("bovalue jest prawdziwe");) inaczej (Printf ("Bovalue jest false");) _GETCH ();)

Wartości logiczne są zwykle generowane przez operatorów porównawczych (\u003d\u003d,! \u003d,\u003e,<, >=. <=).

Język C pokazuje trzech operatorów logicznych: i, czy nie. Zacznijmy od najprostszego

Zaprzeczenie logiczne.

O Peratorze nie jest (nie) używany do odwrócenia wartości argumentu. Te. Jeśli prawda została do niego przeniesiona, zwróciłby kłamstwo, gdyby otrzymał kłamstwo jako argument, to prawda wróciłaby.

Operator logiczny NE.
X. Nie X.
0 1
1 0

W zaprzestaniu się jest reprezentowany przez operatora! na przykład

#Zawierać. #Zawierać. Nieważne główne () (int i \u003d 0; jeśli (I) (printf ("I jest prawdziwe n");) Jeśli (! I) (printf ("Nie jest prawdą n");) Jeśli (!! i) (Printf ("Nie jest prawdą n");) Jeśli (!!! I) (printf ("Nie jestem prawdziwym n");) _getch ();)

Podobnie jak w logice konwencjonalnej, prawo podwójnych aktów zaprzeczonych tutaj - odmowa odmowy można pominąć.

Logiczne I.

O Peratorze i (i, logicznych mnożenia) zwraca prawdę, jeśli i tylko wtedy, gdy obie argumenty są prawdziwe.


Operator logiczny I.
X. Y. X i y.
0 0 0
0 1 0
1 0 0
1 1 1

W logicznych mnożeniach SI jest reprezentowany przez operatora &&. Na przykład, zadanie - tylko dorośli obywatele męskich są dozwolone w kręgu wojskowych spaceminin. Oznacza to, że tylko jeden może stać się koniunktem, dla którego dwa warunki są jednocześnie prawdą

#Zawierać. Nieważny główny () (char płeć; niepodpisany wiek int; printf ("Wprowadź płeć (" M "lub" F ") N"); Skanf ("% C", & Gender); Printf ("Enter Age N" ); Skanf ("% U", i wiek); jeśli (płeć \u003d\u003d "M" && wiek\u003e 17) (Printf ("Wellcome");) )

Operator może być konsekwentnie stosowany do kilku argumentów. Dla niego istnieje przepisy stowarzyszone i łączące. Ulepsz program, wprowadzimy również wzrost:

#Define _crt_secure_no_Warnings #include. #Zawierać. nieważny główny () (char płeć; niepodpisany wiek int; niepodpisana wysokość int; printf ("Wprowadź płeć (" M "lub" F ") N"); Scanf ("% C", & Gender); Printf ("Enter AGE \\ n "); scanfa (" % u "i wiek); printf (" ENTER wYSOKOŚĆ \\ N "); scanfa (" % u "i wysokość), jeśli (płeć \u003d\u003d" M „&& Wiek\u003e 17 Wysokość &&\u003e \u003d 180) (printf ( "Wellcome")) else (printf ( "odejść");) _Getch ())

Również warunek może zostać zarejestrowany

(Gender \u003d\u003d "M" && wiek\u003e 17) && wysokość\u003e \u003d 180

Płeć \u003d\u003d "M" && (wiek\u003e 17 && wysokość\u003e \u003d 180)

(Wiek\u003e 17 && wysokość\u003e \u003d 180) && Gender \u003d\u003d "M"

Logiczne lub.

O Perator Logiczne lub (dodanie logiczne lub) jest prawdziwe, gdy prawda jest co najmniej jednym argumentem.


Operator logiczny lub.
X. Y. X lub y.
0 0 0
0 1 1
1 0 1
1 1 1

W SI lub złożony przez operatora || Na przykład ulepszasz program: Teraz podłoga można wprowadzić zarówno dużą, jak i małą literę

#Define _crt_secure_no_Warnings #include. #Zawierać. Void Główna () (Char Plecinentput; Char Płeć; niepodpisany wiek Int; niepodpisany wysokość int; Printf ("Wprowadź płeć (" M "lub" F ") N"); Scanf ("% C", & Genderinput); Printf ( "ENTER AGE \\ N"); scanf ( "% u", i wiek); printf ( "ENTER wYSOKOŚĆ \\ N"); scanf ( "% u", i wysokość) if (genderinput \u003d\u003d "M" | | GenderinPut \u003d \u003d "M") (płeć \u003d 1;) else (płeć \u003d 0;) czy ((wiek\u003e 17 && wzrost\u003e \u003d 180) && płci) (printf ( "Wellcome")) else (printf (” Go Away”);) _Getch ();)

Podobnie jak w przypadku operatora, lub lub stowarzyszeniowego i stowarzyszeniowego.

Operatorzy można mieszać ze sobą poprzez tworzenie złożonych operatorów

#Define _crt_secure_no_Warnings #include. #Zawierać. nieważne główny () (płeć znak; unsigned int wiek; unsigned int wysokość; printf ( "Podaj płci (" M "i" F ") \\ N"); scanfa ( "% c" i płeć) printf ( "ENTER AGE \\ n "); scanfa (" % u "i wiek); printf (" ENTER wYSOKOŚCI \\ N "); scanfa (" % u”, i wysokość), jeśli ((wiek\u003e 17 && wzrost\u003e \u003d 180) && (Płeć \u003d\u003d "M" || Płeć \u003d\u003d "M")) (printf ( "Wellcome");) ELSE (printf ( "Go Away");) _Getch ();)

Warto pamiętać, że operator odmawiania ma większy priorytet niż lub lub lub, więc zostanie wykonany najpierw. Jeśli sytuacja może się wydarzyć, gdy kolejność wykonania nie jest jasna, określ go za pomocą nawiasów.

Przykład: prawo de Morgana. Aby zmienić i (lub odwrotnie), konieczne jest odwrócenie wartości wszystkich operandów, wymień zarówno lub (lub lub, jak i) i inwertować wynik końcowy. W przypadku naszego stanu

(Wiek\u003e 17 && wysokość\u003e \u003d 180) && (płeć \u003d\u003d "m" || płeć \u003d\u003d "m")

Rozważmy pierwszy kawałek

(Wiek\u003e 17 && wysokość\u003e \u003d 180)

Zmieniamy wszystkie wartości do tyłu

(! (Wiek\u003e 17) &&! (Wysokość\u003e \u003d 180))

wymieniamy operatora && ||

(! (Wiek\u003e 17) ||! (Wysokość\u003e \u003d 180))

i odwróć odpowiedź

! (! (Wiek\u003e 17) || (wysokość\u003e \u003d 180))

Jak widać, wynik jest taki sam. To oczywiste

! (Wiek\u003e 17)

równowartość

Wiek.<= 17

Zmień więc stan

! (Wiek.<= 17 || height < 180)

Zmień drugi wspornik w ten sam sposób.

(Gender \u003d\u003d "M" || Płeć \u003d\u003d "M")

! (Płeć! \u003d "M" && Gender! \u003d "M")

! (Wiek.<= 17 || height < 180) && !(gender != "M" && gender != "m")

Teraz możesz zastosować tę samą regułę i dla całego wyrażenia.

! ((Wiek<= 17 || height < 180) || (gender != "M" && gender != "m"))

Procedura wykonywania operatorów logicznych

P zapewnia wyrażenie

A && B && C && D

gdzie a, b, c, d są wartościami logicznymi. Wszystkie wyrażenie jest równe prawdzie i tylko wtedy, gdy wszystkie operandy są prawdziwe. Jeśli przynajmniej jedna z operandów leży, reszta nie jest już ważna. Dlatego, aby zoptymalizować pracę, obliczenia występuje od lewej do prawej i zatrzymuje się, gdy tylko pierwszy operand stwierdzono równy zero.

W SI Operator przydziałowy może zwrócić wartość. Czasami jest używany bezpośrednio do stanu:

#Define _crt_secure_no_Warnings #include. #Zawierać. #Zawierać. void main () (int a \u003d 0; int * p \u003d jeżeli (a && (p \u003d (int *) malloc (sizeof (int) * 2))) (printf ( "Pamięć została przydzielona");) wolny (p ); _Getch ();)

W tym przypadku operator Malloc nie zostanie wykonany, ponieważ pierwsza operanda A wynosi 0 (odpowiednio, całe wyrażenie wynosi zero). W ten sposób wolne oświadczenie spróbuje wyczyścić pamięć, której nie można oczyścić (ponieważ p będzie nadal odnosić się do). Jeśli zmienimy A \u003d 1, wszystko będzie działać bez problemów.

To samo dzieje się podczas wykonywania ||. Wyrażenie

A ||. B ||. C ||. RE.

jest wykonywany od lewej do prawej aż do pierwszej wartości niezerowej wartości spotkań. Po tym wykonanie zatrzymuje się, jak wiadomo, że cały wyraz jest równy prawdzie.

Uwaga. Wszystkie operacje wynikające z wartości typu Bool

Porównaj operacje i operacje logiczne powodują wartość typu Bool, to jest prawdziwe lub fałszywe. Jeśli taka wyrażenie występuje w kontekście, który wymaga całej wartości, prawda jest konwertowana na 1, a fałsz jest w 0. Oto fragment kodu, który liczy liczbę elementów wektorowych mniejszych niż jakaś określona wartość:

Wektor :: iterator iter \u003d ivec.beg-in (); Podczas gdy (ITER! \u003d IVEC.END ()) (// odpowiednik: e1em_cnt \u003d e1em_cnt + (* iter< some_va1ue) // значение true/false выражения *iter < some_va1ue // превращается в 1 или 0 e1em_cnt += *iter < some_va1ue; ++iter; }

Po prostu dodamy wynik działania "mniej" do miernika. (Para + \u003d wskazuje instrukcję przypisania kompozytów, które składa operand w lewo, a operand, który stoi po prawej stronie. To samo można napisać bardziej kompaktowy: Elem_count \u003d Elem_count + n. Spojrzymy takich operatorów w sekcji 4.4.)
Logiczne i (&&) zwraca prawdę tylko wtedy, gdy obie operandy są prawdziwe. Logiczne lub (||) daje prawdę, jeśli przynajmniej jedna z operandów jest prawdziwa. Gwarantujemy, że operandy są obliczane od lewej do prawej, a obliczenie kończy się, gdy tylko uzyskana wartość stanie się znana. Co to znaczy? Niech dano dwie wyrażenia:

Expr1 && expr2 expr1 || Expr2.

Jeśli w pierwszym z nich, wyr1 jest fałszywa, wartość całego wyrażenia będzie również równa false, niezależnie od wartości wyr2, która nie będzie nawet być obliczona. W drugim wyrażeniu Expr2 nie jest szacowany, jeśli Expr1 jest prawdziwe, ponieważ wartość całej ekspresji jest prawdziwa, niezależnie od Expr2.
Ta metoda obliczeniowa umożliwia wygodne sprawdzenie kilku wyrażeń w jednym operatorze i:

Podczas gdy (ptr! \u003d O && ptr-\u003e va1ue< upperBound && ptr->vA1UE\u003e \u003d 0 && Notfound (IA [PTR-\u003e VA1UE]) (...)

Wskaźnik wartości zerowej nie wskazuje, więc użycie działania dostępu do wskaźnika zerowego do członu spowodowałoby błąd (wartość PTR-\u003e). Jednakże, jeśli PTR wynosi 0, sprawdzenie w pierwszym kroku przestaje przedstawić dalsze obliczenie łodzi. Podobnie, wartość PTR-\u003e wartość wartości jest sprawdzana w drugim i trzecim krokach do żądanego zakresu, a indeks przyjmuje operację nie ma zastosowania do tablicy IA, jeśli ten indeks jest nieprawidłowy.
Operacja logika nie daje prawdą, jeśli jego jedyny operator jest fałszywy i odwrotnie. Na przykład:

Bool Found \u003d False; // Gdy element nie jest znaleziony //, a PTR wskazuje obiekt (nie 0) podczas (! Znaleziono && PTR) (Znaleziono \u003d 1OKUP (* PTR); ++ PTR;)

Podrozdział

Prymuje prawdą, jeśli znalazła się zmienna jest równa fałszywie. Jest to bardziej kompaktowy wpis

Znaleziono \u003d\u003d false.

podobnie

Odpowiednik dłuższego nagrania

Jeśli (znaleziono \u003d\u003d true)

Wykorzystanie operacji porównawczych jest dość oczywiste. Musimy tylko pamiętać, że w przeciwieństwie do i i lub, procedura obliczania operandy takich wyrażeń nie jest zdefiniowana. Oto przykład, w którym podobny błąd jest możliwy:

// Uwaga! Procedura obliczeń nie jest zdefiniowana! Jeśli (Ia [Indeks ++]< ia[ index ]) // поменять местами элементы

Programista zakładał, że lewy operand jest oceniany pierwszy, a elementy IA i Ia zostaną porównywane. Jednak kompilator nie gwarantuje obliczeń od lewej do prawej, a w tym przypadku element IA mogą być porównywane ze sobą. O wiele lepiej jest pisać bardziej zrozumiały i niezależny od maszyny Kod:

Jeśli (Ia [Indeks]< ia[ index+1 ]) // поменять местами элементы ++index;

Inny przykład ewentualnego błędu. Chcieliśmy upewnić się, że wszystkie trzy zmienne do ival i Kval różnią się. Gdzie tęskniliśmy?

// Uwaga! Nie jest to porównanie 3 zmiennej ze sobą, jeśli (Idge! \u003d JVA1! \u003d KVA1) // Zrób coś ...

Wartości 0, 1 i 0 dają w wyniku obliczenia takiego wyrazu prawdziwych. Dlaczego? Najpierw sprawdzane jest, że jest sprawdzany! \u003d JVAL, a następnie wynik tego sprawdzenia (true / false - transformowany do 1/0) jest porównywany z Kval. Musieliśmy wyraźnie pisać:
If (Ival! \u003d JVA1 && IND! \u003d KVA1 && JVA1! \u003d KVA1)
// zrobić coś...

Ćwiczenie 4.4.

Znajdź złe lub nie do zniesienia wyrażeń, wyjaśnij. Jak mogą je zmienić? (Należy pamiętać, że typy obiektów nie odtwarzają ról w tych przykładach.)
(a) ptr-\u003e Iva1! \u003d 0
(C) ptr! \u003d 0 && * ptr ++
(E) VEC [Iva1 ++]<= vec[ ival ];
(b) ival! \u003d jva1< kva1 (d) iva1++ && ival

Ćwiczenie 4.5.

Język C ++ nie dyktuje procedury obliczania operacji porównawczych, aby umożliwić kompilatorowi to zrobić w optymalny sposób. Jak myślisz, co będzie kosztować w tym przypadku, aby poświęcić wydajność, aby uniknąć błędów związanych z założeniem o obliczaniu wyrażenia od lewej do prawej?

Operatorzy relacji i operatorzy logiczni

W notacji. operator relacji i operator logiczny semestr relacje oznacza relację, która może istnieć między dwiema wartościami i terminem logiczny - Związek między wartościami logicznymi "prawdą" i "kłamstwem". A ponieważ operatorzy związku dają prawdziwe lub fałszywe wyniki, często są one używane razem z operatorami logicznymi. Z tego powodu są uważane za wspólnie.

Poniżej znajdują się operatorzy relacji:

Logika zawiera operatory poniżej:

Wynik wykonania operatora relacji lub operatora logicznego jest logiczna wartość typu Bool.

Ogólnie rzecz biorąc, obiekty można porównać do równości lub nierówności za pomocą operatorów relacji \u003d\u003d i! \u003d. Oraz operatory porównania, \u003d mogą być używane tylko do typów danych, które obsługują stosunek zamówienia. W konsekwencji operatorzy relacyjnych można zastosować do wszystkich typów danych numerycznych. Ale wartości typu Bool można porównać tylko do równości lub nierówności, ponieważ true (true) i false (false) wartości nie są zamówione. Na przykład porównanie prawdziwych\u003e false w C # nie ma sensu.

Rozważ przykład programu wykazującego korzystanie z relacji i operatorów logicznych:

Za pomocą systemu; za pomocą System.Collections.genic; Za pomocą System.linq; Za pomocą System.Text; Przestrzeń nazw & VAR2) Console.WRITELINE ("Ten tekst nie wyłączy"); jeśli (! (VAR1 & VAR2)) konsola ("var1 | var2 \u003d true"); jeśli (VAR1 ^ VAR2) konsola.WriteLine ("VAR1 ^ VAR2 \u003d true"); Console.Readline ();)))

Logiczne operatorzy w C # wykonują najczęstsze operacje logiczne. Niemniej jednak istnieje wiele operacji wykonywanych przez zasady logiki formalnej. Te logiczne operacje można zbudować przy użyciu operatorów logicznych obsługiwanych w C #. W związku z tym, w C # Istnieje taki zestaw operatorów logicznych, który jest wystarczający do budowy niemal dowolnej pracy logicznej, w tym implikacje. Amplicytacja - Jest to działanie binarne, którego wynikiem jest fałszywa wartość tylko wtedy, gdy jego lewy operand ma prawdziwe znaczenie, a właściwy jest fałszywy. (Operacja implikacji odzwierciedla następującą zasadę: Prawda nie może oznaczać kłamstwa).

Operacja implikacji może być zbudowana na podstawie kombinacji operatorów logicznych! i |:

Skrócił operatory logiczne.

C # ma również specjalne, skracanie, Opcje operatorów logicznych i, lub, zaprojektowany w celu uzyskania bardziej wydajnego kodu. Wyjaśnijmy w następujących przykładach operacji logicznych. Jeśli pierwsza operanda pracy logicznej i ma fałszywą wartość (false), jego wynik będzie miała fałszywa wartość, niezależnie od wartości drugiego operanda. Jeśli pierwsza operacja operacji logicznej lub ma prawdziwą wartość (prawda), jego wynik będzie miała prawdziwą wartość niezależnie od wartości drugiego operandu. Ze względu na fakt, że wartość drugiego operanda w tych operacjach nie musi być obliczana, oszczędza czas i zwiększa wydajność kodu.

Skrócona logalna operacja i jest wykonywana za pomocą operator &&i skrócona logalna operacja lub - z operator ||.. Skrócone operatorzy logiczny odpowiadają zwykłym operatorom logicznym i |. Jedyna różnica między skróconym operatorem logicznym z zwykłych kłamstw w fakcie, że jego drugi operand jest obliczany tylko w razie potrzeby.

Dzwon.

Są ci, którzy przeczytali tę wiadomość przed tobą.
Subskrybuj odbieranie artykułów świeżych.
E-mail
Nazwa
Nazwisko
Jak chcesz przeczytać dzwonek
Bez spamu