Operatory relacyjne i logiczne

W notacji operator relacji oraz operator logiczny termin relacje oznacza związek, który może istnieć między dwoma znaczeniami, a terminem logiczny- związek między wartościami logicznymi „prawda” i „fałsz”. A ponieważ operatory relacyjne dają prawdę lub fałszywe wyniki, są często używane razem z operatorami logicznymi. Z tego powodu są rozważane razem.

Oto operatory relacyjne:

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 relacyjnych == i !=. Operatory porównania =, można stosować tylko do typów danych, które obsługują relację kolejności. Dlatego operatory relacyjne można stosować do wszystkich typów danych liczbowych. Ale wartości logiczne można porównywać tylko pod kątem równości lub nierówności, ponieważ wartości prawdziwe (prawda) i fałszywe (fałsz) nie są uporządkowane. Na przykład porównywanie true > false w C# nie ma sensu.

Rozważ przykładowy program, który demonstruje użycie operatorów relacyjnych i logicznych:

za pomocą systemu; za pomocą System.Collections.Generic; za pomocą System.Linq; za pomocą 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 & var2) Console.WriteLine("Ten tekst nie zostanie wydrukowany"); if (!(var1 & var2)) Console.WriteLine("!(var1 & var2) = true"); if (var1 | var2) Console.WriteLine("var1 | var2 = true"); if (var1 ^ var2) Console.WriteLine("var1 ^ var2 = true"); Console.ReadLine(); ) ) )

Operatory logiczne w języku C# wykonują najpopularniejsze operacje logiczne. Niemniej jednak istnieje szereg operacji wykonywanych zgodnie z zasadami logiki formalnej. Te operacje logiczne można skompilować przy użyciu operatorów logicznych obsługiwanych w języku C#. W związku z tym C# zapewnia zestaw operatorów logicznych, który jest wystarczający do konstruowania prawie każdej operacji logicznej, w tym implikacji. implikacja jest operacją binarną, której wynikiem jest fałsz tylko wtedy, gdy jej lewy operand jest prawdziwy, a prawy operand jest fałszywy. (Operacja implikacji odzwierciedla zasadę, że prawda nie może implikować fałszu).

Operację implikacji można zbudować na podstawie kombinacji operatorów logicznych! i |:

Skrótowe operatory logiczne

C# zapewnia również specjalne skrócony, warianty operatorów logicznych AND i OR przeznaczone do tworzenia bardziej wydajnego kodu. Wyjaśnijmy to następującymi przykładami operacji logicznych. Jeśli pierwszy operand logicznej operacji AND jest fałszywy, to jego wynik będzie fałszywy, niezależnie od wartości drugiego operandu. Jeśli pierwszy operand logicznej operacji OR jest prawdziwy, jego wynik będzie prawdziwy niezależnie od wartości drugiego operandu. Z uwagi na fakt, że wartość drugiego argumentu w tych operacjach nie musi być obliczana, oszczędza czas i poprawia wydajność kodu.

skrócony operacja logiczna I to się robi operator &&, a skrócona operacja logiczna OR - 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 polega na tym, że jego drugi operand jest oceniany tylko w razie potrzeby.

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

Operacje wykonywane są w ścisłej kolejności. Wartość określająca prawo poboru do wykonania określonej operacji nazywana jest priorytetem. W tabeli. 2 wymienia różne operacje języka C (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ść wykonywania operacji można kontrolować za pomocą nawiasów.

Tabela 2 - operacje

Znak operacji

Cel operacji

Wywołanie funkcji

Wybór elementu tablicy

Podświetlanie elementu rekordu

Podświetlanie elementu rekordu

Logiczna negacja

Negacja bitowa

Zmiana znaku

Zwiększenie jednostki

Zmniejsz o jeden

Biorąc adres

Kontakt według adresu

Konwersja typu (tj. (zmiennoprzecinkowa) a)

Określanie rozmiaru w bajtach

Mnożenie

Definicja pozostałej części podziału

Dodatek

Odejmowanie

Przesuń w lewo

przesunięcie w prawo

Mniej niż

Mniejsze lub równe

Więcej niż

Więcej lub równe

Bitowe logiczne „AND”

Bitowe XOR

Bitowe logiczne „LUB”

Logiczne „ORAZ”

Logiczne „LUB”

Operacja warunkowa (trójargumentowa)

Zadanie

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

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

Przecinek operacji

Operator w języku C (C)

Aby wyeliminować zamieszanie w pojęciach „operacja” i „operator”, zauważamy, że operator jest najmniejszą wykonywalną jednostką programu. Istnieją operatory wyrażeń, których działanie polega na ocenie danych wyrażeń (na przykład: a = sin(b)+c; j++;), operatory deklaracji, operatory złożone, operatory puste, operatory etykiet, operatory cyklu itp. Średnik jest używany do oznaczenia końca instrukcji w C (C). Instrukcja złożona (lub blok), która jest zbiorem logicznie powiązanych instrukcji umieszczonych między otwierającymi (() i zamykającymi ()) nawiasami klamrowymi ("nawiasami operatorowymi"), nie następuje po niej ze średnikiem. Zauważ, ż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 główne operacje języka SI (C).

operacja przypisania

Najpierw rozważ jeden z nich - operator przypisania (=). Wyrażenie formy

przypisuje wartość x do 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. Rozważmy je od operacji przypisanych do pierwszej z poniższych grup tradycyjnych:

Działania arytmetyczne.

Operacje logiczne i relacyjne.

Operacje na bitach.

Operacje arytmetyczne określane są następującymi symbolami (Tabela 2): +, -, *, /, % . Ostatnia z nich nie może być zastosowana do zmiennych typu rzeczywistego. Na przykład:

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

Operacje logiczne

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

Operacje na bitach można stosować do zmiennych typu int, char i ich wariantów (na przykład long int). Nie można ich stosować do zmiennych typu float, double, void (lub bardziej złożonych typów). Operacje te określane są 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&b = 0000 1000,
a^b=100000111,
| b = 1000 1111.

Język udostępnia dwa niekonwencjonalne operatory inkrementacji (++) i dekrementacji (--). Mają one na celu zwiększanie i zmniejszanie o jeden wartości operandu. Operatory ++ i -- można pisać przed lub po operandzie. W pierwszym przypadku (++n lub --n) wartość argumentu (n) jest zmieniana przed użyciem go w odpowiednim wyrażeniu, aw drugim przypadku (n++ lub n--) po jego użyciu. Rozważ 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 inną nietradycyjną operacją trójskładnikową lub warunkową ?: są również szeroko stosowane. W formule

y = a, jeśli x nie jest zerem (tj. Prawda), a y = b, jeśli x wynosi zero (fałsz). Następujące wyrażenie

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

umożliwia przypisanie wartości większej zmiennej (a lub b) do zmiennej y, czyli y = max(a, b).

Kolejną różnicą języka jest to, że wyrażenie postaci a = a + 5; można zapisać w innej formie: a += 5;. Zamiast znaku + można również 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 wykonać określoną instrukcję lub grupę instrukcji określoną liczbę razy. W języku C (C) istnieją trzy instrukcje pętli: for, while i do - while. Pierwsza z nich jest formalnie napisana w następujący sposób:

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

Treść pętli to albo jedna instrukcja, albo kilka instrukcji zawartych w aparat ortodontyczny(...) (po bloku nie ma średnika). Wyrażenia 1, 2, 3 zawierają specjalną zmienną zwaną zmienną kontrolną. Jego wartość jest ustawiona na konieczność powtórzenia cyklu lub wyjścia z niego.

Expression_1 przypisuje wartość początkową do zmiennej sterującej, wyrażenie_3 zmienia ją na każdym kroku, a wyrażenie_2 sprawdza, czy osiągnęło wartość graniczną, która ustawia konieczność wyjścia z pętli.

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

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

/* Pętla będzie wykonywana do momentu pojawienia się klawiatury

znak "p" nie zostanie wprowadzony */

Dowolne z trzech wyrażeń w dla pętli można pominąć, ale średnik musi pozostać. Tak więc for (; ;) (...) jest nieskończoną pętlą, z której można wyjść tylko w inny sposób.

Poniższa zasada została przyjęta w języku SI (C). Każde wyrażenie przypisania ujęte w nawiasy ma taką samą wartość, jak przypisywane. Na przykład wyrażenie (a=7+2) ma wartość 9. Następnie możesz napisać inne wyrażenie, na przykład: ((a=7+2)<10), которое в данном случае будет всегда давать истинное значение. Следующая конструкция:

((ch = getch()) == "i")

pozwala wpisać wartość zmiennej ch i dać prawdziwy wynik tylko wtedy, gdy wpisana wartość to litera „i”. W nawiasach możesz napisać kilka formuł składających się na złożone wyrażenie. Do tych celów używana jest operacja przecinka. Formuły będą oceniane od lewej do prawej, a całe wyrażenie przyjmie wartość ostatniej ocenianej formuły. Na przykład, jeśli istnieją dwie zmienne typu char, to wyrażenie

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

definiuje następujące akcje: wartość zmiennej y jest przypisana do zmiennej x; znak wprowadzany jest z klawiatury i przypisywany do zmiennej y; z otrzymuje wartość y. Nawiasy są tutaj niezbędne, ponieważ operator przecinka ma niższy priorytet niż operator przypisania zapisany po zmiennej z. Operator przecinka jest szeroko stosowany do konstruowania wyrażeń pętli i umożliwia równoległą zmianę wartości kilku zmiennych sterujących.

Konstrukcje zagnieżdżone są dozwolone, tj. ciało pętli może zawierać inne instrukcje for.

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

while (wyrażenie) loop_body

Wyrażenie w nawiasach może przyjmować wartość niezerową (prawda) lub zero (fałsz). Jeśli to prawda, wykonywana jest treść pętli, a wyrażenie jest ponownie oceniane. Jeśli wyrażenie jest fałszywe, pętla while kończy się.

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

zrobić (loop_body) while (wyrażenie);

Główna różnica między pętlami while i do-while polega na tym, że treść pętli do while jest wykonywana co najmniej raz. Treść pętli będzie wykonywana, dopóki wyrażenie w nawiasach nie da wartości false. Jeśli przy wejściu do pętli ma wartość false, to jej ciało jest wykonywane dokładnie raz.

Dozwolone jest zagnieżdżanie niektórych pętli w innych, tj. Instrukcje for, while i do-while mogą pojawić się w ciele każdej pętli.

W treści pętli można użyć nowych instrukcji break i continue. Instrukcja break zapewnia natychmiastowe wyjście z pętli, instrukcja continue powoduje zakończenie kolejnej iteracji i początek kolejnej.

Warunkowe i bezwarunkowe operatory skoku

Aby zorganizować skoki warunkowe i bezwarunkowe w programie C (C), używane są następujące instrukcje: if - else, switch i goto. Pierwsza z nich jest napisana w następujący sposób:

if (check_condition) instrukcja_1; w przeciwnym razie oświadczenie_2;

Jeśli warunek w nawiasach jest prawdziwy, wykonywana jest instrukcja_1; jeśli fałsz, wykonywana jest instrukcja_2. Jeśli konieczne jest wykonanie wielu instrukcji zamiast jednej, są one ujęte w nawiasy klamrowe. Instrukcja if nie może zawierać słowa else.

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

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

przełącznik (wyrażenie)

case stała_1: instrukcje_1;

wielkość liter_2: instrukcje_2;

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

domyślnie: operatorzy_domyślne;

To ocenia wartość całego wyrażenia w nawiasach (czasami nazywanego selektorem) i porównuje je ze wszystkimi stałymi (wyrażeniami stałymi). Wszystkie stałe muszą być różne. Jeśli istnieje dopasowanie, zostanie wykonany odpowiedni wariant instrukcji (jedna lub więcej instrukcji). Wariant ze słowem kluczowym default jest implementowany, jeśli żaden z pozostałych nie pasuje (słowo default może być nieobecne). Jeśli brak jest wartości domyślnej, a wszystkie wyniki porównania są ujemne, żadna z opcji nie zostanie wykonana.

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

Zagnieżdżone konstrukcje przełączników są dozwolone.

Rozważ zasady wykonywania bezwarunkowego skoku, 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 określa, że ​​wykonywanie programu powinno być kontynuowane 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ć.

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

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

W C++ istnieją trzy operacje logiczne:

  1. Znamy już logiczną operację AND && ;
  2. Operacja logiczna LUB || ;
  3. Operacja logiczna NIE ! lub negacja logiczna.

Operacje logiczne tworzą złożony (złożony) warunek z kilku prostych (dwóch lub więcej) warunków. Operacje te kilkakrotnie upraszczają strukturę kodu programu. Tak, możesz się bez nich obejść, ale wtedy liczba ifs wzrasta kilkakrotnie, w zależności od stanu. W poniższej tabeli krótko scharakteryzowano wszystkie operacje logiczne w języku programowania C++ do tworzenia warunków logicznych.

Teraz powinieneś zrozumieć różnicę między operacją logiczną AND a operacją logiczną OR, aby nie pomylić się w przyszłości. Czas zapoznać się z typem danych głupota-logiczny. Ten typ danych może przyjmować dwie wartości: prawda (prawda) i fałsz (fałsz). Warunek do sprawdzenia w instrukcjach select ma typ danych bool . Rozważ zasadę następującego programu, a wszystko będzie jasne dzięki wszystkim tym logicznym operacjom.

// or_and_not.cpp: Określa punkt wejścia dla aplikacji konsolowej. #include "stdafx.h" #include używając standardowej przestrzeni nazw; 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 10powinieneś być jasny, ponieważ zmienne tego typu są tutaj inicjowane głupota . Każda zmienna ma przypisaną wartość prawda czy fałsz . Zaczynając od 9 linia i zakończenie 20., pokazujący 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 || fałsz: 0 !true: 0 !false: 1 Naciśnij dowolny klawisz, aby kontynuować. . .

Rysunek 1 — Operacje logiczne C++

Prawdopodobnie masz pytanie „Czym są te zera i jedynki?”. Jeśli jest pytanie, to trzeba na nie odpowiedzieć. Odpowiadam: „Zero jest reprezentacją wartości logicznej fałsz (fałsz), ale jedynki to wartość logiczna prawda (prawda).” Pozwólcie, że pokrótce wyjaśnię kilka punktów. Warunek złożony za pomocą Boolean I jest prawdziwe tylko wtedy, gdy oba proste warunki są prawdziwe. We wszystkich innych przypadkach warunek złożony jest fałszywy. Warunek złożony używający logicznego OR jest fałszywy tylko wtedy, gdy oba proste warunki są fałszywe. We wszystkich innych przypadkach warunek złożony jest prawdziwy. Logiczna negacja NIE jest operacją jednoargumentową i nie łączy dwóch warunków, w przeciwieństwie do operacji logicznych I oraz 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 na odwrót.

Na obiektach w języku C można wykonywać różne operacje:

  • operacje przydziału;
  • operacje relacyjne;
  • arytmetyka;
  • łamigłówka;
  • operacje zmianowe.

Wynikiem operacji jest liczba.

Operacje mogą być binarne lub jednoargumentowe.
Operacje binarne są wykonywane na dwóch obiektach, operacje jednoargumentowe na jednym.

operacja przypisania

Operacja przypisania jest oznaczona symbolem = i odbywa się w 2 etapach:

  • wyrażenie po prawej stronie jest oceniane;
  • wynik jest przypisany do operandu po lewej stronie:

obiekt = wyrażenie;

Przykład:

int a = 4; // zmiennej a przypisana jest wartość 4
intb;
b = a + 2; // zmiennej b przypisana jest wartość 6 obliczona po prawej stronie

Jeśli obiekty w lewej i prawej części operacji przypisania mają różne typy, używana jest operacja jawnej konwersji typu.
obiekt = (typ) wyrażenie;

Przykład:

pływak a = 241,5;
// Przed obliczeniem pozostałej części dzielenia a jest rzutowane na typ całkowity
intb = (int)a% 2; // b = 1

operacje relacyjne

Podstawowe operacje na relacjach:

  • == ekwiwalent - sprawdź równość;
  • != nie równe - sprawdź nierówności;
  • < mniej;
  • > jeszcze;
  • <= mniejsze lub równe;
  • >= więcej lub równe.

Operacje relacyjne służą do organizowania warunków i oddziałów. Wynikiem tych operacji jest 1 bit, którego wartość wynosi 1, jeśli wynik operacji jest prawdziwy, a 0, jeśli wynik operacji jest fałszywy.

Działania arytmetyczne

Podstawowe operacje binarne, uporządkowane w malejącej kolejności pierwszeństwa:

  • * - mnożenie;
  • / - podział;
  • + - dodatek;
  • - odejmowanie;
  • % to reszta z dzielenia liczb całkowitych.

Podstawowe operacje jednoargumentowe:

  • ++ - inkrementacja (wzrost o 1);
  • -- - dekrementacja (zmniejszenie o 1);
  • - zmiana znaku.

Wynik oceny wyrażenia zawierającego operacje inkrementacji lub dekrementacji zależy od tego, gdzie znajduje się znak operacji (przed lub za obiektem). Jeżeli operacja znajduje się przed obiektem, to wartość zmiennej jest najpierw zmieniana na 1, a następnie ta wartość jest używana do wykonywania kolejnych operacji. Jeśli operacja ++ lub znajduje się za zmienną, to operacja jest wykonywana jako pierwsza, a następnie zmieniana jest wartość zmiennej na 1.

Przykład :

Binarne operacje arytmetyczne można łączyć z operatorem przypisania:

  • obiekt *= wyrażenie; // obiekt = obiekt * wyrażenie
  • obiekt /= wyrażenie; // obiekt = obiekt / wyrażenie
  • obiekt += wyrażenie; // obiekt = obiekt + wyrażenie
  • obiekt -= wyrażenie; // obiekt = obiekt - wyrażenie
  • obiekt %= wyrażenie; // obiekt = obiekt % wyrażenie

Operacje logiczne

Operacje logiczne dzielą się na dwie grupy:

  • warunkowy;
  • bitowo.

Warunkowe operacje logiczne są najczęściej używane w operacjach sprawdzania warunków i mogą być wykonywane na dowolnym obiekcie. Wynik warunkowej operacji logicznej:

  • 1 jeśli wyrażenie jest prawdziwe;
  • 0 jeśli wyrażenie jest fałszywe.

Ogólnie wszystkie wartości niezerowe są interpretowane przez warunkowe operacje logiczne jako prawdziwe.

Podstawowe warunkowe operacje logiczne:

  • && - I (binarny) - wymagane jest jednoczesne wykonanie wszystkich operacji relacji;
  • || - OR (binarny) - wymagana jest co najmniej jedna operacja relacji;
  • ! - NOT (jednorazowy) - wymagane jest niewykonanie operacji relacji.

Bitowe operacje logiczne operują na bitach, z których każdy może przyjmować tylko dwie wartości: 0 lub 1.

Podstawowe bitowe operacje logiczne w języku C:

  • & koniunkcja (logiczne AND) - operacja binarna, której wynikiem jest 1 tylko wtedy, gdy oba operandy są pojedyncze (w ogólnym przypadku, gdy wszystkie operandy są pojedyncze);
  • | alternatywa (logiczne OR) - operacja binarna, której wynikiem jest 1, gdy przynajmniej jeden z argumentów ma wartość 1;
  • ~ inwersja (logiczne NIE) jest operacją jednoargumentową, której wynikiem jest 0, jeśli operand jest pojedynczy, i 1, jeśli operand jest równy zero;
  • ^ XOR to operacja binarna, której wynikiem jest 1, jeśli tylko jeden z dwóch operandów ma wartość 1 (ogólnie, jeśli wejściowy zestaw operandów ma nieparzystą liczbę jedynek).

Dla każdego bitu wynik operacji zostanie uzyskany zgodnie z tabelą.

a b a&b | b ~a a^b
0 0 0 0 1 0
0 1 0 1 1 1
1 0 0 1 0 1
1 1 1 1 0 0

Przykład :

1
2
3
4
5
6
7

znak bez znaku a = 14; // a = 0000 1110
znak bez znaku b = 9; // b = 0000 1001
unsigned char c, d, e, f;
c = a&b; // c = 8 = 0000 1000
d = a | b; // d = 15 = 0000 1111
e = ~a; // e = 241 = 1111 0001
f = a^b; // f = 7 = 0000 0111


Operacje bitowe umożliwiają ustawianie i resetowanie poszczególnych bitów liczby. W tym celu jest używany maskowanie bitowe. W tabeli przedstawiono maski odpowiadające ustawieniu każdego bitu w bajcie

Fragment Maska
0 0x01
1 0x02
2 0x04
3 0x08
4 0x10
5 0x20
6 0x40
7 0x80

Aby ustawić określony bit, należy ustawić odpowiedni bit maski na 1 i wykonać bitową operację logiczną OR ze stałą reprezentującą maskę.

Składnia operatora przypisania SI to:
LWartość = RWartość;
LValue to miejsce, w którym zostanie zapisana wartość. Tylko zmienna może pełnić funkcję takiego obiektu w SI.
RValue to wartość, którą wypiszemy do LValue. A w tej roli obiekty takie jak:
zmienny,
stały,
operator wywołania funkcji,
wyrażenie matematyczne lub logiczne.
Przykłady przypisania
int a, b, c;
podwójne x, y;
a = 5; b = 4; c = a + b;
x=5,0; y = exp(x);

Ulepszone operatory przypisania w SI

W SI są tak zwane ulepszone operatory przypisania, wyglądają one tak:
LWartość X= RWartość; gdzie X jest jedną operacją ze zbioru: + - * / % ^ & | >. to jest analogia operatora przypisania:
LValue = LValue X RValue;
Na przykład:
a += b; ≡ a = a + b;
W języku C wszystkie operacje matematyczne można podzielić na 2 grupy:
1. operacje matematyczne do obliczeń rzeczywistych i całkowitych;
2. Operacje matematyczne tylko do obliczeń na liczbach całkowitych.

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

Dopasowywanie typu wyniku z typów operandów

Cechy języka SI

Rozważ jedną 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 jest wykonywana nie przez dzielenie, ale przez dzielenie liczb całkowitych, lub:
podwójny x = 1 / 3; // x będzie równe 0, z tego samego powodu, co w poprzednim przykładzie

Operacje na obliczeniach całkowitych

Obliczenia liczb całkowitych obejmują:
operacja przejęcia pozostałej części dywizji,
operacje bitowe,
operacje zmianowe,
operacje inkrementacyjne i dekrementacyjne.
Operacja brania reszty z dzielenia (mod) jest operacją binarną i w języku SI jest oznaczona symbolem procentu (%). Przykład obliczenia:
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ą operację jednoargumentową. Binarne operacje bitowe obejmują:
operacja "ORAZ" (&),
operacja „LUB” (|)
operacja „Ekskluzywne LUB” (^).

Oto tabela prawdy dla tych operacji:

pierwszy argument drugi argument operacja
oraz 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

Jednoargumentowy operator bitowy to operator negacji oznaczony znakiem 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 operandzie w prawo (symbol >>) lub w lewo (symbol<<) на указанное во втором операнде целое число бит. Пример:
znak bez znaku a = 10, b, c; //a: 00001010 = 10
b = a<< 2; //b: 00101000 = 40
c = a >> 1; // c: 00000101 = 5

Operacje inkrementacji i dekrementacji

Operatory inkrementacji (znak ++) i dekrementacji (znak -) są jednoargumentowe i odpowiednio zwiększają i zmniejszają wartość całkowitą o jeden.
int a = 10, b, c;
b = ++a //przyrost wstępny b == 11
c = a++; //post-inkrementacja c == 11

We współczesnych językach programowania (w tym w języku SI standardu C99) operacje te mogą być również stosowane dla wartości 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 operatory relacyjne (porównania) to operatory binarne, które porównują dwa operandy i zwracają wynik porównania jako wartość logiczną. W języku C zwyczajowo interpretuje się wartości logiczne TRUE i FALSE jako wartości całkowite:
0 - FAŁSZ, 1 - PRAWDA.
Oznaczenie Nazwa
> Więcej
< Mniej
>= Więcej lub równe
<= Mniejsze lub równe
== 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=c==a; //r == 0

Operacje logiczne w SI

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

Operacje logiczne


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

Priorytety operacyjne

++, -- Operacje postinkrementacyjne i dekrementacyjne
() Wywołanie funkcji, operacje grupujące
Dostęp do elementu tablicy
-> Dostęp do struktury lub pola unii za pomocą wskaźnika
. Odwoływanie się do struktury lub pola unii
++, -- Operacje pre-inkrementacji i dekrementacji
! Logiczne „NIE”
~ Negacja binarna (inwersja)
+, - Jednoargumentowy plus i minus
& Adres podjąć operację
* Wyłuskiwanie wskaźnika
rozmiar Operator rozmiaru
(rodzaj) Operator konwersji typu
* Mnożenie
/ Podział
% Biorąc resztę dywizji
+ Dodatek
- Odejmowanie
<<, >> Bit przesuwa się w lewo i w prawo
<, <=, >, >= Operacje porównawcze
==, != Operacje porównawcze
& Bitowe „i”
^ Bitowe XOR
| Bitowe „LUB”
Logiczne „ORAZ”
|| Logiczne „LUB”
?: Operacja warunkowa
= Prosty operator przypisania
*=, /=, %=, +=, -=, <<=, >>=, &=, ^=,|= Ulepszeni operatorzy przypisania
, Przecinek

Funkcje tłumaczy


Kolejność, w jakiej argumenty funkcji są oceniane podczas jej wywoływania, nie jest zdefiniowana. 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 jest zwiększane przed, czy po wywołaniu pow. Aby rozwiązać problem, po prostu napisz to tak: n++;
printf("%d %lf\n", n,pow(2.0,n));

Schemat automatycznego wymuszania typu


1. Jeśli któryś z operatorów jest typu długi podwójny, to drugi zostaje zredukowany do długi podwójny.
2. W przeciwnym razie, jeśli któryś z operatorów ma typ podwójnie, to drugi zostaje zredukowany do podwójnie.
3. W przeciwnym razie, jeśli któryś z operatorów ma typ platforma, to drugi zostaje zredukowany do platforma.
4. W przeciwnym razie dla obu operandów wykonywane jest rozszerzenie typu liczb całkowitych; wtedy, jeśli jeden z operandów jest typu unsigned long int, to drugi jest konwertowany na unsigned long int.
5. W przeciwnym razie, jeśli jeden z operandów jest typu długa int, a drugi to niepodpisany, to wynik zależy od tego, czy długa int wszystkie wartości niepodpisany; jeśli tak, to operand typu niepodpisany
6.cast do pisania długa int; jeśli nie, oba operandy są konwertowane na unsigned long int.
7. W przeciwnym razie, jeśli jeden z operandów jest typu długa int, to drugi zostaje zredukowany do długa int.
8. W przeciwnym razie oba operandy są typu int.

Operator obsady

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

Operator rzutowania typu: (typ) wyrażenie.
r = (podwójny) a / b; //Prawidłowo
r = (podwójny) (a / b); //Niewłaściwie

Operacja warunkowa


W języku C istnieje tak zwany operator warunkowy, który ma następującą składnię:
stan? wyrażenie #1: wyrażenie #2;
Przykład operacji warunkowej. Konieczne jest wprowadzenie z klawiatury dwóch rzeczywistych wartości i wyświetlenie na ekranie maksimum z tych wartości:
#włączać


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

Konieczne jest wprowadzenie z klawiatury trzech rzeczywistych wartości​​i wyświetlenie maksimum z tych wartości:
#włączać

int main(int argc, char *argv)
  {
podwójne x, y, z;
printf("Wprowadź wartości: ");
scanf("%lf %lf %lf",&x,&y,&z);
podwójny max = (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 czwartej potęgi, używając tylko dwóch mnożeń.
#włączać

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

Równanie kwadratowe postaci jest podane 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("Wpisz współczynniki A, B i C: ");
scanf("%lf %lf %lf",&a,&b,&c);
podwójne d = b*b-4*a*c;
int n = (d< 0.0)?0:(d > 0.0)?2:1;
printf("Liczba pierwiastków: %d\n",n);
zwróć 0;
  }