Operacje arytmetyczne i logiczne w c. Wyrażenia warunkowe

Ponieważ w poprzednim artykule po raz pierwszy użyłem operacji logicznych, powiem ci, czym one są, ile ich jest i jak z nich korzystać.

W C++ istnieją trzy operacje logiczne:

  1. Operacja logiczna AND && jest nam już znana;
  2. Operacja logiczna OR || ;
  3. Operacja logiczna NIE ! lub logiczna negacja.

Operacje logiczne tworzą złożony (złożony) warunek z kilku prostych (dwóch lub więcej) warunków. Operacje te kilkukrotnie upraszczają strukturę kodu programu. Tak, możesz się bez nich obejść, ale wtedy liczba if wzrasta kilkakrotnie, w zależności od warunków. Poniższa tabela krótko opisuje wszystkie operacje logiczne w języku programowania C++ służące do konstruowania warunków logicznych.

Teraz powinieneś zrozumieć różnicę pomiędzy operacją logiczną AND a operacją logiczną OR, aby nie pomylić się w przyszłości. Czas zapoznać się z typem danych bool-logiczny. Ten typ danych może przyjmować dwie wartości: true i false. Warunek testowany w instrukcjach Select ma typ danych bool. Rozważmy zasadę działania poniższego programu, a przy wszystkich tych logicznych operacjach wszystko stanie się jasne.

// or_and_not.cpp: Definiuje punkt wejścia dla aplikacji konsolowej. #include "stdafx.h" #include używając przestrzeni nazw std; int main(int argc, char* argv) ( bool a1 = true, a2 = false; // deklaracja zmiennych logicznych bool a3 = true, a4 = 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; }

Linie 9 i 10powinno być dla ciebie jasne, ponieważ zmienne tego typu są tutaj inicjowane bool . Ponadto każdej zmiennej przypisana jest wartość prawda czy fałsz . Zaczynając od 9. linia i zakończenie 20, pokazuje użycie operacji logicznych. Wynik programu (patrz rysunek 1).

Tablica istinnosti log operacii && true && false: 0 false && true: 0 true && true: 1 false && false: 0 Tablica istinnosti log operacii || prawda || fałsz: 1 fałsz || prawda: 1 prawda || prawda: 1 fałsz || false: 0 Tablica istinnosti log operacii ! !true: 0 !false: 1 Aby kontynuować, naciśnij dowolny klawisz. . .

Rysunek 1 – Operacje logiczne w C++

Prawdopodobnie masz pytanie: „Co to są te zera i jedynki?” Jeśli jest pytanie, należy na nie odpowiedzieć. Odpowiadam: „Zero jest reprezentacją wartości logicznej fałszywej, a jedynki wartością logiczną prawdziwą”. Pokrótce wyjaśnię niektóre kwestie. Warunek złożony przy użyciu wartości logicznej I jest prawdziwe tylko wtedy, gdy oba warunki pierwsze są spełnione. We wszystkich pozostałych przypadkach warunek złożony jest fałszywy. Warunek złożony wykorzystujący logiczne OR jest fałszywy tylko wtedy, gdy oba proste warunki są fałszywe. We wszystkich pozostałych przypadkach warunek złożony jest prawdziwy. Negacja logiczna NIE jest operatorem jednoargumentowym i nie łączy dwóch warunków, w przeciwieństwie do operatorów logicznych I I LUB, które są operacjami binarnymi. Negacja logiczna pozwala odwrócić znaczenie warunku, co w niektórych przypadkach jest bardzo wygodne. Warunek z logiczną negacją jest prawdziwy, jeśli ten sam warunek jest fałszywy bez negacji i odwrotnie.

Każde wyrażenie językowe składa się z operandów (zmiennych, stałych itp.) połączonych znakami operacji. Znak operacji to symbol lub grupa symboli, która nakazuje kompilatorowi wykonanie określonych operacji arytmetycznych, logicznych lub innych.

Operacje wykonywane są w ścisłej kolejności. Wartość określająca prawo pierwszeństwa do wykonania określonej operacji nazywa się priorytetem. W tabeli 2 wymienia różne operacje języka SI (C). Ich priorytety dla każdej grupy są takie same (grupy są wyróżnione kolorem). Im większą przewagę ma dana grupa operacji, tym wyżej znajduje się w tabeli. Kolejność operacji można kontrolować za pomocą nawiasów.

Tabela 2 – operacje

Znak operacji

Cel operacji

Wywołanie funkcji

Wybieranie elementu tablicy

Wybór elementu rekordu

Wybór elementu rekordu

Negacja logiczna

Negacja bitowa

Zmiana znaku

Zwiększ o jeden

Zmniejsz o jeden

Biorąc adres

Adres kontaktowy

Konwersja typu (tj. (float)a)

Określanie rozmiaru w bajtach

Mnożenie

Wyznaczanie reszty z dzielenia

Dodatek

Odejmowanie

Przesuń w lewo

Przesuń w prawo

Mniej niż

Mniej lub równo

Więcej niż

Więcej lub równo

Bitowe logiczne „AND”

Bitowe wyłączne „LUB”

Bitowe logiczne „LUB”

Logiczne „ORAZ”

Logiczne „LUB”

Działanie warunkowe (trójskładnikowe).

Zadanie

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

Operacje binarne (na przykład a *= b
(tj. a = a * b) itd.)

Operacja przecinkowa

Operator w języku C (C)

Aby uniknąć nieporozumień związanych z pojęciami „operacja” i „operator”, zauważmy, że operator to najmniejsza wykonywalna jednostka programu. Istnieją operatory wyrażeń, których efektem jest ocena danych wyrażeń (na przykład: a = sin(b)+c; j++;), operatory deklaracji, operatory złożone, operatory puste, operatory etykiet, operatory pętli itp. W języku SI (C) średnik oznacza koniec instrukcji. W przypadku instrukcji złożonej (lub bloku), która jest zbiorem logicznie powiązanych instrukcji umieszczonych pomiędzy otwierającymi (() i zamykającymi ()) nawiasami klamrowymi („nawiasy klamrowe instrukcji”), nie następuje po niej średnik. Należy zauważyć, że blok różni się od instrukcji złożonej obecnością definicji w treści bloku.

Charakterystyka podstawowych operacji języka C (C)

Scharakteryzujmy podstawowe operacje języka SI (C).

Operator przypisania

Na początek przyjrzyjmy się jednemu z nich – operatorowi przypisania (=). Wyrażenie formy

przypisuje zmiennej x wartość zmiennej y. Operatora „=” można użyć wielokrotnie w jednym wyrażeniu, na przykład:

x = y = z = 100;

Istnieją operacje jednoargumentowe i binarne. Pierwszy z nich ma jeden operand, a drugi dwa. Zacznijmy nasze rozważania od operacji sklasyfikowanych w pierwszej z następujących tradycyjnych grup:

Działania arytmetyczne.

Operacje logiczne i relacyjne.

Operacje na bitach.

Działania arytmetyczne oznaczone są następującymi symbolami (tabela 2): +, -, *, /, %. Ostatniego z nich nie można zastosować do zmiennych typu rzeczywistego. Na przykład:

za = b + do;
x = y - z;
r = t * v;
s = k/l;
p = q% w;

Operacje logiczne

Logiczne operacje relacyjne są oznaczone następującymi symbolami (patrz tabela 2): && („I”), || ("LUB"), ! („NIE”), >, >=,<, <= , = = (равно), != (не равно). Традиционно эти операции должны давать одно из двух значений: истину или ложь. В языке СИ (C)принято следующее правило: истина - это любое ненулевое значение; ложь - это нулевое значение. Выражения, использующие логические операции и операции отношения, возвращают 0 для ложного значения и 1 для истинного. Ниже приводится таблица истинности для логических операций.

Operacje bitowe można stosować do zmiennych typu int, char i ich wariantów (na przykład long int). Nie można ich zastosować do zmiennych typu float, double, void (ani bardziej złożonych typów). Operacje te są określone następującymi symbolami: ~ (negacja bitowa),<< (сдвиг влево), >> (przesunięcie w prawo), & (bitowe AND), ^ (bitowe XOR), | (bitowo „LUB”).

Przykłady: jeśli a=0000 1111 i b=1000 1000, to

~a = 1111 0000,
A<< 1 = 0001 1110,
a >> 1 = 0000 0111,
a i b = 0000 1000,
a^b = 1000 0111,
| b = 1000 1111.

Język udostępnia dwie nietradycyjne operacje: inkrementację (++) i dekrementację (--). Ich zadaniem jest zwiększanie i zmniejszanie wartości argumentu o jeden. Operacje ++ i -- można zapisać przed lub po operandie. W pierwszym przypadku (++n lub --n) wartość argumentu (n) ulega zmianie przed jego użyciem w odpowiednim wyrażeniu, a w drugim (n++ lub n--) - po jego użyciu. Rozważmy następujące dwie linie programu:

a = b + c++;
a1 = b1 + +c1;

Załóżmy, że b = b1 = 2, c = c1 = 4. Następnie po wykonaniu operacji: a = 6, b = 2, c = 5, a1 = 7, b1 = 2, c1 = 5.

Wyrażenia z innym nietradycyjnym operatorem trójskładnikowym lub warunkowym są również szeroko rozpowszechnione: . W formule

y = a, jeśli x nie wynosi zero (tj. prawda) i y = b, jeśli x wynosi zero (fałsz). Następne wyrażenie

y = (a>b)? za: b;

pozwala na przypisanie zmiennej y wartości większej zmiennej (a lub b), tj. y = maks. (a, b).

Inną różnicą w języku jest to, że wyrażenie w postaci a = a + 5; można zapisać w innej formie: a += 5;. Zamiast znaku + można także użyć symboli innych operacji binarnych (patrz tabela 2).

Inne operacje z tabeli. 2 zostaną opisane w kolejnych paragrafach.

Pętle są zorganizowane tak, aby wykonywać określoną instrukcję lub grupę instrukcji określoną liczbę razy. W języku SI (C) występują trzy instrukcje pętlowe: for, while i do - while. Pierwszy z nich jest formalnie zapisany w następujący sposób:

for (wyrażenie_1; wyrażenie_2; wyrażenie_3) ciało_pętli

Ciało pętli składa się z jednej instrukcji lub kilku instrukcji ujętych w nawiasy klamrowe (...) (po bloku nie ma średnika). Wyrażenia 1, 2, 3 zawierają specjalną zmienną zwaną zmienną sterującą. Na podstawie jego wartości określa się potrzebę powtórzenia cyklu lub wyjścia z niego.

Wyrażenie_1 przypisuje wartość początkową do zmiennej sterującej, Wyrażenie_3 zmienia ją w każdym kroku, a Wyrażenie_2 sprawdza, czy osiągnęło wartość graniczną, która decyduje o konieczności zakończenia pętli.

dla (i = 1; tj< 10; i++)

for (ch = "a"; ch != "p";) scanf („%c”, &ch);

/* Pętla będzie działać aż do klawiatury

znak „p” nie zostanie wprowadzony */

Może brakować dowolnego z trzech wyrażeń w pętli for, ale średnik musi pozostać. Zatem for (; ;) (...) jest nieskończoną pętlą, z której można wyjść tylko w inny sposób.

W języku SI (C) akceptowana jest następująca zasada. Każde wyrażenie przypisania ujęte w nawiasy ma wartość przypisania. Przykładowo wyrażenie (a=7+2) ma wartość 9. Następnie można napisać kolejne wyrażenie, np.: ((a=7+2)<10), которое в данном случае будет всегда давать истинное значение. Следующая конструкция:

((сh = getch()) == „i”)

pozwala na wprowadzenie wartości zmiennej ch i podanie prawdziwego wyniku tylko wtedy, gdy wpisaną wartością jest litera „i”. Możesz także zapisać w nawiasach kilka formuł tworzących złożone wyrażenie. W tym celu używany jest operator przecinka. Formuły będą oceniane od lewej do prawej, a całe wyrażenie przyjmie wartość ostatniej obliczonej formuły. Na przykład, jeśli istnieją dwie zmienne typu char, wówczas wyrażenie

z = (x = y, y = getch());

definiuje następujące działania: wartość zmiennej y zostaje przypisana zmiennej x; z klawiatury wprowadza się znak i przypisuje się go zmiennej y; z pobiera wartość zmiennej y. Nawiasy są tu konieczne, ponieważ operacja przecinka ma niższy priorytet niż operacja przypisania zapisana po zmiennej z. Operacja przecinkowa jest szeroko stosowana do konstruowania wyrażeń pętlowych i pozwala na równoległą zmianę wartości kilku zmiennych sterujących.

Dozwolone są struktury zagnieżdżone, tj. W ciele pętli mogą znajdować się inne instrukcje for.

Instrukcja while jest formalnie zapisana w następujący sposób:

while (wyrażenie) pętla_body

Wyrażenie w nawiasach może przyjmować wartość różną od zera (prawda) lub zero (fałsz). Jeżeli jest to prawda, to wykonywane jest ciało pętli i ponownie obliczane jest wyrażenie. Jeśli wyrażenie jest fałszywe, pętla while kończy się.

Instrukcja do-while jest formalnie zapisana w następujący sposób:

wykonaj (loop_body) podczas (wyrażenie);

Główna różnica między pętlą while a pętlą do - while polega na tym, że treść pętli do - while jest wykonywana co najmniej raz. Ciało pętli będzie wykonywane do momentu, aż wyrażenie w nawiasach zwróci wartość false. Jeśli przy wejściu do pętli ma wartość false, wówczas jej treść jest wykonywana dokładnie raz.

Dopuszczalne jest zagnieżdżanie jednych cykli w innych, tj. Operatory for, while i do - while mogą pojawiać się w treści dowolnej pętli.

W treści pętli można używać nowych operatorów break icontinue. Operator break zapewnia natychmiastowe wyjście z pętli, operator kontynuowania powoduje zakończenie kolejnej iteracji i rozpoczęcie kolejnej.

Operatory skoków warunkowych i bezwarunkowych

Aby zorganizować przejścia warunkowe i bezwarunkowe w programie w języku SI (C), stosuje się następujące operatory: if - else, switch i goto. Pierwsza z nich zapisana jest następująco:

if (condition_check) instrukcja_1; inaczej operator_2;

Jeśli warunek w nawiasach ma wartość true, wykonywana jest instrukcja_1, jeśli jest fałszywa, wykonywana jest instrukcja_2. Jeśli zamiast jednej ma zostać wykonanych kilka instrukcji, są one ujęte w nawiasy klamrowe. Instrukcja if nie może zawierać słowa else.

W instrukcji if - else po słowach kluczowych if i else muszą bezpośrednio następować inne instrukcje. Jeśli przynajmniej jedna z nich jest instrukcją if, nazywa się ją zagnieżdżoną. Zgodnie z konwencją SI(C) słowo else zawsze odnosi się do najbliższego poprzedzającego if.

Instrukcja switch pozwala wybrać jedną z kilku alternatyw. Jest on zapisany w następującej formie formalnej:

przełącznik (wyrażenie)

stała przypadku_1: instrukcje_1;

stała przypadku_2: instrukcje_2;

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

domyślnie: operator_default;

W tym przypadku wartość całego wyrażenia w nawiasach (czasami nazywanego selektorem) jest oceniana i porównywana ze wszystkimi stałymi (wyrażeniami stałymi). Wszystkie stałe muszą być różne. Jeśli istnieje dopasowanie, zostanie wykonana odpowiednia wersja operatorów (jeden lub więcej operatorów). Opcja ze słowem kluczowym default jest implementowana, jeśli żadna inna nie jest odpowiednia (słowo default może być nieobecne). Jeśli nie ma wartości domyślnej i wszystkie wyniki porównania są negatywne, wówczas żadna z opcji nie zostanie wykonana.

Aby zatrzymać kolejne sprawdzenia po pomyślnym wybraniu określonej opcji, używana jest instrukcja break, która zapewnia natychmiastowe wyjście z przełącznika.

Dozwolone są zagnieżdżone konstrukcje przełączników.

Rozważmy zasady wykonywania bezwarunkowego przejścia, które można przedstawić w następującej formie:

przejdź do etykiety;

Etykieta to dowolny identyfikator, po którym następuje dwukropek. Instrukcja goto wskazuje, że wykonywanie programu musi być kontynuowane, zaczynając od instrukcji poprzedzonej etykietą. Etykietę można umieścić przed dowolną instrukcją w funkcji, w której znajduje się odpowiednia instrukcja goto. Nie trzeba tego ogłaszać.

Turbo Debugger w pełni obsługuje składnię wyrażeń języka SI (C). Wyrażenie składa się z kombinacji operacji, ciągów znaków i zmiennych

  Składnia operatora przypisania języka SI jest następująca:
   LValue = RWartość;
   LValue to miejsce, w którym zostanie zapisana wartość. Tylko zmienna może pełnić rolę takiego obiektu w SI.
  RValue to wartość, którą zapiszemy w LValue. A taką rolę mogą pełnić takie obiekty jak:
   zmienny,
   stały,
   operator wywołania funkcji,
   wyrażenie matematyczne lub logiczne.
  Przykłady zadań
   int a, b, c;
   podwójne x, y;
   a = 5; b = 4; do = za + b;
   x = 5,0; y = exp(x);

Ulepszone operatory przypisania w SI

  SI zawiera tzw. ulepszone operatory przypisania, wyglądają one tak:
   LValue X= RWartość; gdzie X jest jedną operacją ze zbioru: + - * / % ^ & | >. jest to analogiczne do operatora przypisania:
   LValue = LValue X RValue;
  Np:
   za += b; ≡ za = za + b;
  W języku SI wszystkie operacje matematyczne można podzielić na 2 grupy:
   1. działania matematyczne w obliczeniach liczb rzeczywistych i całkowitych;
   2. Operacje matematyczne tylko do obliczeń liczb całkowitych.

Operacje matematyczne do obliczeń rzeczywistych i całkowitych w języku SI obejmują zwykłe operacje arytmetyczne:
   dodatek (+),
   odejmowanie (-),
   mnożenie (*), dzielenie (/).

Dopasowywanie typu wyniku do typów operandów

Cechy języka SI

  Przyjrzyjmy się jednej z funkcji na przykładzie:
   int a, b;
   podwójne c;
   a = 10;
   b = 4;
   c = a/b; // c będzie równe 2, ponieważ operacja nie polega na dzieleniu, ale na dzieleniu przez liczbę całkowitą, lub:
   podwójne x = 1 / 3; // x będzie równe 0 z tego samego powodu, co w poprzednim przykładzie

Operacje na obliczeniach całkowitych

  Operacje na liczbach całkowitych obejmują:
   operacja brania reszty z dzielenia,
   operacje bitowe
   operacje zmianowe,
   Operacje zwiększania i zmniejszania.
  Operacja wzięcia reszty z dzielenia (mod) jest operacją binarną i jest oznaczona w SI symbolem procentu (%). Przykład obliczeń:
   int a = 10, b = 3, c;
   c = a% b; // c będzie równe 1

Operacje bitowe w SI

  Operacje bitowe języka SI są reprezentowane przez trzy operacje binarne i jedną jednoargumentową. Binarne operacje bitowe obejmują:
   Operacja AND (&),
   Operacja LUB (|)
   operacja „Wyłączne LUB” (^).

Oto tabela prawdy dla tych operacji:

pierwszy operand drugi operand operacja
I Lub ekskluzywny lub
0 0 0 0 0
1 0 0 1 1
0 1 0 1 1
1 1 1 1 0

Operacje bitowe

Jednoargumentowa operacja bitowa jest operacją negacji, oznaczoną symbolem tyldy (~). Przykład:
   znak bez znaku a = 10, b; //a: 00001010 = 10
   b = ~a; //b: 11110101 = 245

Operacje zmianowe

Operacje przesunięcia wykonują bitowe przesunięcie wartości całkowitej określonej w pierwszym operandze w prawo (symbol >>) lub w lewo (symbol<<) на указанное во втором операнде целое число бит. Пример:
  znak bez znaku a = 10, b, c; //a: 00001010 = 10
  b = a<< 2; //b: 00101000 = 40
  do = za >> 1; //c: 00000101 = 5

Operacje zwiększania i zmniejszania

Operacje zwiększania (znak +) i zmniejszania (znak -) są jednoargumentowe i odpowiednio zwiększają i zmniejszają wartość całkowitą o jeden.
  int a = 10, b, c;
  b = ++a //wstępna inkrementacja b == 11
  c = a++; //po inkrementacji z == 11

  We współczesnych językach programowania (m.in. w języku SI standardu C99) operacje te można stosować także na wartościach rzeczywistych. Przykład:
  podwójne x = 12,5;
  x++;
  printf("%lf\n",x); //wyjście: 13.5

Operacje relacyjne (porównania)

W językach programowania operacje relacyjne (porównania) to operacje binarne, które porównują dwa operandy i zwracają wynik porównania w postaci wartości logicznej. W języku SI zwyczajowo interpretuje się wartości logiczne PRAWDA i FAŁSZ za pomocą wartości całkowitych:
  0 – FAŁSZ, 1 – PRAWDA.
Oznaczenie Nazwa
> Więcej
< Mniej
>= Więcej lub równo
<= Mniej lub równo
== Równa się
!= Nie równe

Przykłady
Kilka przykładów użycia operatorów porównania:
  int a=5, b=4, c=10, x, y;
  x = a > b; //x == 1
  y = do == a; //y == 0

Operacje logiczne w SI

Operacje logiczne to operacje jednoargumentowe lub binarne, które wykonują akcje na wartościach logicznych i zwracają wartość logiczną. Zestaw operacji logicznych w różnych językach programowania może być inny.

Operacje logiczne


  Przykłady operacji logicznych:
   int a=1, b=0, c, d; //a – PRAWDA, b – FAŁSZ
   c = za || B; //c == 1
   d = !b && a; //d == 1

Priorytety operacyjne

++, -- Operacje po inkrementacji i dekrementacji
() Wywołanie funkcji, grupowanie operacji
Dostęp do elementu tablicy
-> Dostęp do struktury lub pola unii poprzez wskaźnik
. Dostęp do struktury lub pola unii
++, -- Operacje poprzedzające inkrementację i dekrementację
! Logiczne „NIE”
~ Negacja binarna (inwersja)
+, - Jednoargumentowy plus i minus
& Operacja odbioru adresu
* Dereferencja wskaźnika
rozmiar Operator wymiarowania
(typ) Wpisz operator konwersji
* Mnożenie
/ Dział
% Biorąc resztę z dzielenia
+ Dodatek
- Odejmowanie
<<, >> Bitowe przesuwanie w lewo i w prawo
<, <=, >, >= Operacje porównawcze
==, != Operacje porównawcze
& Bitowe „AND”
^ Bitowe wyłączne LUB
| Bitowe LUB
Logiczne „ORAZ”
|| Logiczne „LUB”
?: Działanie warunkowe
= Prosty operator przypisania
*=, /=, %=, +=, -=, <<=, >>=, &=, ^=,|= Ulepszone operatory przypisania
, Przecinek

Cechy tłumaczy


  Kolejność, w jakiej argumenty funkcji są oceniane podczas jej wywoływania, nie jest określona. Dlatego poniższa instrukcja może dawać różne wyniki po przetłumaczeniu przez różne kompilatory:
   printf("%d %lf\n", ++n, pow(2.0,n));
  Wynik będzie zależał od tego, czy n zostanie zwiększone przed, czy po wywołaniu funkcji pow. Aby rozwiązać problem, po prostu napisz to w ten sposób:    n++;
   printf("%d %lf\n", n,pow(2.0,n));

Schemat automatycznego rzutowania typów


  1.Jeśli którykolwiek z operatorów jest typu długi podwójny, to oba drugie są zredukowane do długi podwójny.
  2.Else, jeśli którykolwiek z operatorów jest typu podwójnie, to oba drugie są zredukowane do podwójnie.
  3.Else, jeśli którykolwiek z operatorów jest typu platforma, to oba drugie są zredukowane do platforma.
  4. W przeciwnym razie dla obu operandów wykonywane jest rozwinięcie typu całkowitego; wtedy, jeśli jeden z operandów jest typu długi int bez znaku, a następnie drugi jest konwertowany na długi int bez znaku.
  5. W przeciwnym razie, jeśli jeden z operandów jest typu długi wew, i inni - bez znaku int, wynik zależy od tego, czy długi wew wszystkie znaczenia bez znaku int; jeśli tak, to operand jest podobny bez znaku int
  6. rzutuj na pisanie długi wew; jeśli nie, oba operandy są konwertowane na długi int bez znaku.
  7.Else, jeśli jeden z operandów jest typu długi wew, to oba drugie są zredukowane do długi wew.
  8. W przeciwnym razie oba operandy są typu wew.

Operator obsady

   int a = 15, b = 2; podwójne r = 0,0;
   r = a/b; //r == 7,0

  Wpisz operator rzutowania: (typ)wyrażenie.
   r = (podwójny)a / b; //Prawidłowy
   r = (podwójny) (a/b); //Zło

Działanie warunkowe


  W języku SI istnieje tzw. operacja warunkowa, która ma następującą składnię:
   stan : schorzenie? wyrażenie nr 1: wyrażenie nr 2;
  Przykład operacji warunkowej. Należy wprowadzić z klawiatury dwie wartości rzeczywiste i wyświetlić maksimum z tych wartości:
   #włączać


  {
    podwójne x, y;
    scanf("%lf %lf",&x,&y);
    podwójne maks. = (x > y)? x:y;
    zwróć 0;
  }

  Należy wprowadzić z klawiatury trzy wartości rzeczywiste i wyświetlić maksimum z tych wartości:
   #włączać

Int main(int argc, char *argv)
  {
    podwójne x, y, z;
    printf("Wpisz wartości: ");
    scanf("%lf %lf %lf",&x,&y,&z);
    podwójne maks. = (x > y)? ((x > z) ? x: z): ((y > z) ? y:z);
    printf("Wartość maksymalna: %lf\n",max);
    zwróć 0;
  }

  Z klawiatury wprowadza się liczbę rzeczywistą. Podnieś liczbę do potęgi czwartej, wykonując tylko dwie operacje mnożenia.
   #włączać

Int main(int argc, char *argv)
  {
    podwójne A;
    printf("Podaj wartość: ");
    scanf("%lf"&a);
    a *= (a *=a);
    printf("Wynik: %lf\n",a);
    zwróć 0;
  }

  Równanie kwadratowe postaci jest dane przez współczynniki A, B i C. Określ, ile pierwiastków ma to równanie.
   #włączać

Int main(int argc, char *argv)
  {
    podwójne a, b, c;
    printf("Podaj współczynniki A, B i C: ");
    scanf("%lf %lf %lf",&a,&b,&c);
    podwójne d = b*b-4*a*c;
    int n = (zm< 0.0)?0:(d > 0.0)?2:1;
    printf("Liczba pierwiastków: %d\n",n);
    zwróć 0;
  }

Notatka. Wszystkie operacje dają wartość typu bool

Wynikiem porównań i operacji logicznych jest wartość typu bool, czyli prawda lub fałsz. Jeśli takie wyrażenie występuje w kontekście wymagającym wartości całkowitej, prawda jest konwertowana na 1, a fałsz na 0. Oto fragment kodu, który zlicza liczbę elementów wektora mniejszych niż pewna podana wartość:

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

Po prostu dodajemy wynik operacji less than do licznika. (Para += oznacza złożony operator przypisania, który dodaje operand po lewej stronie i operand po prawej stronie. To samo możemy napisać bardziej zwięźle: elem_count = elem_count + n. Przyjrzymy się takim operatorom w podrozdziale 4.4. )
Logiczne AND (&&) zwraca wartość true tylko wtedy, gdy oba operandy mają wartość true. Logiczne OR (||) ma wartość true, jeśli przynajmniej jeden z jego operandów jest prawdziwy. Gwarantowane jest, że operandy są oceniane od lewej do prawej, a ocena kończy się, gdy tylko znana będzie wartość wynikowa. Co to znaczy? Niech zostaną podane dwa wyrażenia:

Wyrażenie1 && wyrażenie2 wyrażenie1 || wyrażenie2

Jeśli w pierwszym z nich wyrażenie1 będzie fałszywe, wartość całego wyrażenia również będzie fałszywa, niezależnie od wartości wyrażenia2, które nawet nie będzie oceniane. W drugim wyrażeniu wyrażenie2 nie jest oceniane, jeśli wyrażenie1 ma wartość true, ponieważ całe wyrażenie ma wartość true niezależnie od wyrażenia2.
Ta metoda obliczeń umożliwia wygodne testowanie kilku wyrażeń w jednym operatorze AND:

Podczas gdy (ptr != O && ptr->wartość< upperBound && ptr->wartość >= 0 && notFound(ia[ ptr->wartość ])) ( ... )

Wskaźnik zerowy nie wskazuje na żaden obiekt, więc zastosowanie operacji dostępu do elementu członkowskiego do wskaźnika zerowego spowodowałoby błąd (ptr->wartość). Jeśli jednak ptr wynosi 0, sprawdzenie w pierwszym kroku zatrzymuje dalszą ocenę podwyrażeń. Podobnie w drugim i trzecim kroku sprawdza się, czy wartość ptr->value mieści się w wymaganym zakresie, a operacja pobrania indeksu nie jest wykonywana do tablicy m.in. w przypadku, gdy ten indeks jest nieprawidłowy.
Logiczna operacja NOT ma wartość true, jeśli jej jedyny operator jest fałszywy i odwrotnie. Na przykład:

Znaleziono wartość boolową = fałsz; // do momentu znalezienia elementu // i ptr wskazuje obiekt (nie 0) while (! found && ptr) ( found = 1lookup(*ptr); ++ptr; )

Podwyrażenie

Zwraca wartość true, jeśli znaleziono wartość false. Jest to bardziej zwarty zapis dla

Znaleziono == fałsz

Podobnie

Odpowiednik dłuższego wpisu

Jeśli (znaleziono == prawda)

Zastosowanie operacji porównania jest dość oczywiste. Należy tylko pamiętać, że w przeciwieństwie do AND i OR, kolejność oceniania argumentów takich wyrażeń nie jest zdefiniowana. Oto przykład, w którym taki błąd jest możliwy:

// Uwaga! Kolejność obliczeń nie jest określona! if (ia[indeks++ ]< ia[ index ]) // поменять местами элементы

Programista założył, że najpierw zostanie obliczony lewy operand, a następnie porównane zostaną elementy ia i ia. Kompilator nie gwarantuje jednak oceny od lewej do prawej, w takim przypadku element ia można porównać ze sobą. Dużo lepiej jest napisać bardziej zrozumiały i niezależny od komputera kod:

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

Kolejny przykład możliwego błędu. Chcieliśmy mieć pewność, że wszystkie trzy wartości ival, jval i kval są różne. Gdzie popełniliśmy błąd?

// Uwaga! to nie jest porównywanie ze sobą 3 zmiennych if (ival != jva1 != kva1) // zrób coś ...

Wartości 0, 1 i 0 mają wartość true. Dlaczego? Najpierw sprawdzane jest ival != jval, a następnie wynik tego sprawdzenia (prawda/fałsz – przeliczony na 1/0) jest porównywany z kval. Powinniśmy byli wyraźnie napisać:
if (ival != jva1 && ival != kva1 && jva1 != kva1)
// coś zrobić...

Ćwiczenie 4.4

Znajdź nieprawidłowe lub nietolerowane wyrażenia i wyjaśnij. Jak można je zmienić? (Zauważ, że typy obiektów nie odgrywają roli w tych przykładach.)
(a) ptr->iva1 != 0
(c) ptr != 0 && *ptr++
(e)vec[iva1++]<= vec[ ival ];
(b) ival != jva1< kva1 (d) iva1++ && ival

Ćwiczenie 4.5

Język C++ nie narzuca kolejności, w jakiej oceniane są operacje porównania, aby umożliwić kompilatorowi zrobienie tego w optymalny sposób. Czy uważasz, że warto w tym przypadku poświęcić wydajność, aby uniknąć pułapek wynikających z założenia, że ​​wyrażenie jest oceniane od lewej do prawej?

Operatory relacyjne i logiczne

W notacji operator relacyjny I operatora logicznego termin relacja oznacza związek, który może istnieć pomiędzy dwoma znaczeniami, a terminem logiczny- związek między wartościami logicznymi „prawda” i „fałsz”. A ponieważ operatory relacyjne dają prawdziwe lub fałszywe wyniki, często używa się ich razem z operatorami logicznymi. Z tego powodu rozpatrywane są łącznie.

Poniżej znajdują się operatory relacji:

Operatory logiczne obejmują:

Wynikiem wykonania operatora relacyjnego lub logicznego jest wartość logiczna typu bool .

Ogólnie rzecz biorąc, obiekty można porównywać pod kątem równości lub nierówności za pomocą operatorów relacji == i !=. Operatory porównania = można stosować tylko do typów danych obsługujących relację kolejności. Dlatego operatory relacji można zastosować do wszystkich typów danych numerycznych. Ale wartości bool można porównywać tylko pod kątem równości lub nierówności, ponieważ wartości prawdziwe i fałszywe nie są uporządkowane. Na przykład porównanie prawda > fałsz w języku C# nie ma sensu.

Spójrzmy na przykładowy program demonstrujący użycie operatorów relacyjnych i logicznych:

Korzystanie z systemu; przy użyciu System.Collections.Generic; przy użyciu System.Linq; przy użyciu System.Text; przestrzeń nazw ConsoleApplication1 ( class Program ( static void Main(string args) ( short d = 10, f = 12; bool var1 = true, var2 = false; if (d f) Console.WriteLine("d > f"); // Porównanie zmienne var1 i var2 if (var1 i var2) Console.WriteLine("Ten tekst nie zostanie wydrukowany"); if (!(var1 & var2)) Console.WriteLine("!(var1 & var2) = true" | zmienna2) Console.WriteLine("zmienna1 | zmienna2 = prawda"); if (zmienna1 ^ zmienna2) Console.WriteLine("zmienna1 ^ zmienna2 = prawda");

Operatory logiczne w języku C# wykonują najczęstsze operacje logiczne. Niemniej jednak istnieje szereg operacji wykonywanych zgodnie z zasadami logiki formalnej. Te operacje logiczne można konstruować przy użyciu operatorów logicznych obsługiwanych w języku C#. W związku z tym C# udostępnia zestaw operatorów logicznych wystarczający do skonstruowania niemal każdej operacji logicznej, łącznie z implikacją. Implikacja jest operacją binarną, której wynik jest fałszywy tylko wtedy, gdy jej lewy operand ma wartość true, a prawy operand jest fałszywy. (Działanie implikacji odzwierciedla następującą zasadę: prawda nie może implikować fałszu.)

Operację implikacji można skonstruować w oparciu o kombinację operatorów logicznych! i |:

Skrócone operatory logiczne

C# zapewnia również specjalne skrócony, warianty operatorów logicznych AND i OR, zaprojektowane w celu uzyskania bardziej wydajnego kodu. Wyjaśnimy to na poniższych przykładach operacji logicznych. Jeżeli pierwszy operand logicznej operacji AND jest fałszywy, wówczas jej wynik będzie fałszywy niezależnie od wartości drugiego operandu. Jeśli pierwszy operand logicznej operacji OR jest prawdziwy, jej wynik będzie prawdziwy niezależnie od wartości drugiego operandu. Ze względu na to, że w tych operacjach nie trzeba obliczać wartości drugiego operandu, oszczędza czas i zwiększa wydajność kodu.

Skróconą operację logiczną AND wykonuje się za pomocą operator &&, a skrócona operacja logiczna OR jest wykonywana za pomocą operator ||. Te skrócone operatory logiczne odpowiadają zwykłym operatorom logicznym & i |. Jedyna różnica między skróconym operatorem logicznym a zwykłym operatorem polega na tym, że jego drugi operand jest oceniany tylko w razie potrzeby.



Prawa autorskie © 2024 Przeglądarki. Programy antywirusowe. Bezpieczeństwo. Okna. Gry. Karty wideo.