Okna.  Wirusy.  Laptopy.  Internet.  Biuro.  Narzędzia.  Kierowcy

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ż

Mniejsze lub równe

Ponad

Większe lub równe

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 przecinek

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:

Operacje 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. Operatory ++ 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.

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

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, rozpoczynają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

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

  • operacje przydziału;
  • operacje relacyjne;
  • arytmetyka;
  • logiczny;
  • operacje ścinania.

Wynikiem operacji jest liczba.

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

Operator przypisania

Operacja przypisania jest oznaczona symbolem = i jest wykonywana w 2 krokach:

  • obliczane jest wyrażenie po prawej stronie;
  • wynik jest przypisywany do operandu po lewej stronie:

obiekt = wyrażenie;

Przykład:

int a = 4; // zmiennej a przypisuje się wartość 4
int b;
b = a + 2; // zmiennej b przypisuje się wartość 6 obliczoną po prawej stronie

Jeśli obiekty po lewej i prawej stronie operacji przypisania mają różne typy, używana jest jawna operacja rzutowania typów.
obiekt = (typ)wyrażenie;

Przykład:

pływak a = 241,5;
// Przed obliczeniem reszty dzielenia a jest rzutowane na typ całkowity
int b = (int )a % 2; // b = 1

Operacje na relacjach

Podstawowe operacje na relacjach:

  • == równoważny - test równości;
  • != nierówne - sprawdź nierówność;
  • < mniej;
  • > więcej;
  • <= mniejszy lub równy;
  • >= większy lub równy.

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

Operacje arytmetyczne

Podstawowe operacje binarne, w kolejności malejącego priorytetu:

  • * - mnożenie;
  • / - dział;
  • + - dodatek;
  • - odejmowanie;
  • % jest resztą z dzielenia liczb całkowitych.

Podstawowe operacje jednoargumentowe:

  • ++ — inkrementacja (zwiększenie o 1);
  • -- — dekrementacja (zmniejszenie o 1);
  • — zmiana znaku.

Wynik oceny wyrażenia zawierającego operacje zwiększające lub zmniejszające zależy od tego, gdzie znajduje się znak operacji (przed lub za obiektem). Jeżeli operacja znajduje się przed obiektem, to najpierw wartość zmiennej zostaje zmieniona na 1, a następnie na tej wartości wykonywane są kolejne operacje. Jeśli operacja ++ Lub znajdującej się za zmienną, najpierw wykonywana jest operacja, a następnie wartość zmiennej zostaje zmieniona 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 testowania warunku i można je wykonywać na dowolnych obiektach. Wynik warunkowej operacji logicznej:

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

Ogólnie rzecz biorąc, wszystkie wartości inne niż zero są interpretowane jako prawdziwe przez warunkowe operatory logiczne.

Podstawowe warunkowe operacje logiczne:

  • && — I (binarny) - wymagane jest jednoczesne wykonanie wszystkich operacji relacji;
  • || — OR (binarny) - wymagana jest co najmniej jedna operacja relacyjna;
  • !

- NOT (jednoargumentowy) - wymagane jest niewykonanie operacji relacyjnej.

Bitowe operacje logiczne działają 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) jest operacją binarną, której wynik jest równy 1 tylko wtedy, gdy oba operandy są jednością (w ogólnym przypadku, gdy wszystkie operandy są jednym);
  • ~ dysjunkcja (logiczne OR) jest operacją binarną, której wynikiem jest 1, gdy przynajmniej jeden z operandów wynosi 1;
  • ^ inwersja (logiczne NOT) jest operacją jednoargumentową, której wynikiem jest 0, jeśli operand ma wartość jeden, i jest równy 1, jeśli operand ma wartość zero;

Ekskluzywne OR to operacja binarna, której wynikiem jest 1, jeśli tylko jeden z dwóch operandów ma wartość 1 (ogólnie, jeśli w wejściowym zestawie operandów znajduje się nieparzysta liczba jedynek).

Dla każdego bitu wynik operacji zostanie uzyskany zgodnie z tabelą. A B a&b | B ~a
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

a^b
znak bez znaku a = 14; // a = 0000 1110
znak bez znaku b = 9; // b = 0000 1001
znak bez znaku 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 się go używa trochę maskowania

. W tabeli przedstawiono maski odpowiadające ustawieniom każdego bitu w bajcie Fragment
0 Maska
1 0x01
2 0x02
3 0x04
4 0x08
5 0x10
6 0x20
7 0x40

0x80

Aby ustawić konkretny bit, należy ustawić odpowiedni bit maski na 1 i wykonać bitową operację logiczną OR na stałej będącej maską.

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ą wyniki prawdziwe lub fałszywe, często używa się ich razem z operatorami logicznymi. Z tego powodu rozpatrywane są łącznie.

Poniżej znajdują się operatory relacji:

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. Z uwagi 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.

Tagi: C operatory logiczne, negacja logiczna, logiczne NOT, !, logiczne OR, dodawanie logiczne, OR, mnożenie logiczne, logiczne AND, AND, kolejność wykonywania operatorów logicznych

Operatory logiczne

Operatory logiczne to operatory, które przyjmują wartości logiczne (fałsz lub prawda) jako argumenty i zwracają wartość logiczną. Podobnie jak zwykłe operatory, mogą być jednomiejscowe (jednoargumentowe, to znaczy przyjmować jeden argument), dwumiejscowe (binarne, przyjmować dwa argumenty), trzymiejscowe itp.

Cechą szczególną języka C jest to, że nie ma on typu przechowującego wartość logiczną (fałsz lub prawda). W C liczba całkowita 0 jest uważana za kłamstwo (logiczne zero), a każda niezerowa liczba całkowita będzie logiczną prawdą. Na przykład

#włączać #włączać void main() ( char boolValue = -71; if (boolValue) ( ​​​​printf("boolValue jest prawdziwa"); ) else ( printf("boolValue jest fałszywa"); ) _getch(); )

Wartości logiczne są zwykle generowane przez operatory porównania (==, !=, >,<, >=. <=).

W języku C istnieją trzy operatory logiczne: AND, OR i NOT. Zacznijmy od najprostszego

Negacja logiczna

Operator NOT służy do odwracania wartości argumentu. Oznacza to, że jeśli zostanie mu przekazana prawda, zwróci fałsz, jeśli jako argument otrzyma fałsz, zwróci prawdę.

Operator logiczny NIE
X NIE X
0 1
1 0

W C negację reprezentuje operator !. Na przykład

#włączać #włączać void main() ( int i = 0; if (i) ( printf("i jest prawdą\n"); ) if (!i) ( printf("nie jest prawdą\n"); ) if (!! i) ( printf("nie jest to prawdą\n"); ) if (!!!i) ( printf("nie jest to prawdą\n"); ) _getch();

Podobnie jak w zwykłej logice, obowiązuje tu prawo podwójnej negacji - negację negacji można pominąć.

Logiczne AND

Operator AND (AND, mnożenie logiczne) zwraca prawdę wtedy i tylko wtedy, gdy oba argumenty są prawdziwe.


Operator logiczny AND
X Y X i Y
0 0 0
0 1 0
1 0 0
1 1 1

Mówiąc prościej, mnożenie logiczne jest reprezentowane przez operator &&. Na przykład zadanie polega na tym, że do kręgu wojskowych marynarzy kosmicznych mogą wstępować wyłącznie pełnoletni obywatele płci męskiej. Oznacza to, że kandydatem może zostać tylko ten, dla którego spełnione są jednocześnie dwa warunki

#włączać void main() ( char płeć; unsigned int wiek; printf("Wpisz płeć ("M" lub "F")\n"); scanf("%c", &gender); printf("Wpisz wiek\n") ; scanf("%u", &wiek); if (płeć == "M" && wiek > 17) ( printf("Witamy"); ) else ( printf("Odejdź"); ) _getch();

Operator AND można zastosować sekwencyjnie do wielu argumentów. Podlega prawom asocjacji i przemienności. Udoskonalimy program, a także wprowadzimy wzrost:

#zdefiniuj _CRT_SECURE_NO_WARNINGS #include #włączać void main() ( char płeć; unsigned int wiek; unsigned int wysokość; printf("Wpisz płeć ("M" lub "F")\n"); scanf("%c", &gender); printf("Wpisz wiek \n"); scanf("%u", &wiek); printf("Podaj wzrost\n"); scanf("%u", &wzrost); if (płeć == "M" && wiek > 17 && wzrost > = 180) ( printf("Witaj"); ) else ( printf("Odejdź"); ) _getch();

Warunek można również zapisać

(płeć == „M” i& wiek > 17) && wzrost >= 180

Płeć == „M” && (wiek > 17 i wzrost >= 180)

(wiek > 17 i& wzrost >= 180) && płeć == "M"

Logiczne LUB

Logiczny operator OR (dodatek logiczny OR) jest prawdziwy, jeśli przynajmniej jeden z jego argumentów jest prawdziwy.


Operator logiczny LUB
X Y X LUB Y
0 0 0
0 1 1
1 0 1
1 1 1

W C OR jest reprezentowane przez operator ||. Na przykład ulepszmy program: teraz płeć można wprowadzać zarówno dużymi, jak i małymi literami

#zdefiniuj _CRT_SECURE_NO_WARNINGS #include #włączać void main() ( char płećInput; char płeć; unsigned int wiek; unsigned int wysokość; printf("Podaj płeć ("M" lub "F")\n"); scanf("%c", &genderInput); printf( "Podaj wiek\n"); scanf("%u", &wiek); printf("Podaj wzrost\n"); scanf("%u", &wzrost = "m") ( płeć = 1; ) else ( płeć = 0; ) if ((wiek > 17 i wzrost >= 180) && płeć) ( printf("Witamy"); ) else ( printf("Odejdź"); ) _getch();

Podobnie jak operator AND, OR jest przemienne i łączne.

Operatory można mieszać ze sobą, tworząc złożone operatory

#zdefiniuj _CRT_SECURE_NO_WARNINGS #include #włączać void main() ( char płeć; unsigned int wiek; unsigned int wysokość; printf("Wpisz płeć ("M" lub "F")\n"); scanf("%c", &gender); printf("Wpisz wiek \n"); scanf("%u", &wiek); printf("Podaj wzrost\n"); scanf("%u", &wzrost); if ((wiek > 17 i& wzrost >= 180) && (płeć == "M" ||. płeć == "m")) ( printf("Witaj"); ) else ( printf("Odejdź"); ) _getch();

Trzeba tylko pamiętać, że operator negacji ma wyższy priorytet niż AND czy OR, więc zostanie wykonany jako pierwszy. Jeżeli może zaistnieć sytuacja, w której kolejność wykonania nie jest jasna, należy ją określić za pomocą nawiasów.

Przykład: prawo De Morgana. Aby zamienić AND na OR (lub odwrotnie), należy odwrócić wartości wszystkich operandów, zamienić AND na OR (lub OR na AND) i odwrócić wynik końcowy. W przypadku naszego stanu

(wiek > 17 && wzrost >= 180) && (płeć == "M" || płeć == "m")

Najpierw rozważmy kawałek

(wiek > 17 i wzrost >= 180)

Odwróć wszystkie wartości

(!(wiek > 17) && !(wzrost >= 180))

zamień operator && na ||

(!(wiek > 17) || !(wzrost >= 180))

i odwróć odpowiedź

!(!(wiek > 17) || !(wzrost >= 180))

Jak widać, wynik jest taki sam. To oczywiste

!(wiek > 17 lat)

równowartość

Wiek<= 17

Zmieńmy zatem warunek

!(wiek<= 17 || height < 180)

Zmieńmy drugi nawias w ten sam sposób

(płeć == „M” || płeć == „m”)

!(płeć != „M” && płeć != „m”)

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

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

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

Kolejność wykonywania operatorów logicznych

Rozważmy wyrażenie

A && B && C && D

gdzie a, b, c, d są wartościami logicznymi. Całe wyrażenie jest prawdziwe wtedy i tylko wtedy, gdy wszystkie operandy są prawdziwe. Jeśli przynajmniej jeden z operandów jest fałszywy, pozostałe nie są już ważne. Dlatego, aby zoptymalizować wydajność, obliczenia przebiegają od lewej do prawej i kończą się, gdy tylko pierwszy argument ma wartość zero.

W C operator przypisania może zwrócić wartość. Czasami jest używany bezpośrednio w warunku:

#zdefiniuj _CRT_SECURE_NO_WARNINGS #include #włączać #włączać void main() ( int a = 0; int *p = if (a && (p = (int*) malloc(sizeof(int) * 2))) ( printf("przydzielono pamięć"); ) free(p _getch();

W tym przypadku operator malloc nie zostanie wykonany, ponieważ pierwszy operand a jest równy 0 (odpowiednio całe wyrażenie jest równe zero). Zatem wolny operator będzie próbował wyczyścić pamięć, której nie może wyczyścić (ponieważ p będzie nadal odnosić się do a). Jeśli zmienimy a = 1, to wszystko będzie działać bez problemów.

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

|| b || c || D

jest wykonywany od lewej do prawej, aż do napotkania pierwszej wartości niezerowej. Następnie wykonywanie zostaje zatrzymane, ponieważ wiadomo, że całe wyrażenie jest prawdziwe.

W tekście w dowolnym języku naturalnym występują cztery główne elementy: symbole, słowa, frazy i zdania. Język algorytmiczny również zawiera takie elementy, tylko słowa nazywane są leksemami (konstrukcjami elementarnymi), frazy nazywane są wyrażeniami, a zdania nazywane są operatorami. Tokeny powstają z symboli, wyrażenia z tokenów i symboli, operatory z symboli wyrażeń i tokenów (ryc. 1.1)

Ryż. 1.1. Skład języka algorytmicznego

Zatem elementami języka algorytmicznego są:

1) Alfabet języka SI++, który obejmuje

- wielkie i małe litery łacińskie oraz podkreślenie;

— cyfry arabskie od 0 do 9;

— znaki specjalne „(),| ()+-/%*.\’:;&?<>=!#^

— znaki białych znaków (spacja, tabulator, znaki nowej linii).

2) Leksemy językowe powstają z symboli:

Identyfikatory– nazwy obiektów programu SI. Identyfikator może zawierać litery łacińskie, cyfry i podkreślenia. Wielkie i małe litery są różne, na przykład PROG1, prog1 i Prog1 to trzy różne identyfikatory. Pierwszy znak musi być literą lub znakiem podkreślenia (nie cyfrą). Spacje w identyfikatorach są niedozwolone.

Klawisz(zarezerwowane) słowa to słowa, które mają specjalne znaczenie dla kompilatora. Nie można ich używać jako identyfikatorów.

— Znaki operacji to jeden lub więcej symboli definiujących akcję na operandach. Operacje dzielą się na jednoargumentowe, binarne i trójskładnikowe w zależności od liczby operandów biorących udział w tej operacji.

Stałe– są to wielkości niezmienne. Istnieją stałe całkowite, rzeczywiste, znakowe i łańcuchowe. Kompilator identyfikuje stałą jako leksem (konstrukcję elementarną) i przypisuje ją do jednego z typów na podstawie jej wyglądu.

Separatory– nawiasy, kropka, przecinek, znaki spacji.

Stałe w C++

Stały to token reprezentujący obraz o ustalonej wartości liczbowej, łańcuchowej lub znakowej.

Stałe są podzielone na 5 grup:

— rzeczywiste (zmiennoprzecinkowe);

- przeliczalne;

- symboliczne;

- sznurek.

Kompilator wybiera leksem i przypisuje go do tej lub innej grupy, a następnie w obrębie grupy do określonego typu na podstawie jego formy w tekście programu i jego wartości liczbowej.

Stałe całkowite mogą być dziesiętne, ósemkowe lub szesnastkowe. Stałą dziesiętną definiuje się jako ciąg cyfr dziesiętnych rozpoczynający się od czegoś innego niż 0, chyba że liczba ta wynosi 0 (przykłady: 8, 0, 192345). Stała ósemkowa to stała, która zawsze zaczyna się od 0. Po 0 następują cyfry ósemkowe (przykłady: 016 - wartość dziesiętna 14, 01). Stałe szesnastkowe to ciąg cyfr szesnastkowych poprzedzony znakami 0x lub 0X (przykłady: 0xA, 0X00F).

W zależności od wartości stałej całkowitej, kompilator będzie ją różnie reprezentował w pamięci komputera (tzn. kompilator przypisze stałej odpowiedni typ danych).

Stałe rzeczywiste mają inną formę reprezentacji wewnętrznej w pamięci komputera. Kompilator rozpoznaje takie stałe według ich typu. Stałe rzeczywiste mogą mieć dwie formy reprezentacji: stałoprzecinkową i zmiennoprzecinkową. Typ stałej zmiennoprzecinkowej: [cyfry].[cyfry] (przykłady: 5.7, .0001, 41.). Typ stałej zmiennoprzecinkowej: [cyfry].[cyfry]E|e[+|-][cyfry ] (przykłady: 0,5e5, .11e-5, 5E3). Zapisując stałe rzeczywiste, można pominąć części całkowite lub ułamkowe, przecinek dziesiętny lub znak wykładnika z wykładnikiem.

Stałe przeliczalne wprowadza się za pomocą słowa kluczowego enum. Są to zwykłe stałe całkowite, którym przypisano unikalne i łatwe w użyciu oznaczenia. Przykłady: wyliczenie ( jeden=1, dwa=2, trzy=3, cztery=4);

enum (zero,one,two,three) – jeśli w definicji wyliczanych stałych pominiesz znaki = i wartości numeryczne, to wartości zostaną przypisane domyślnie. W tym przypadku identyfikator skrajnie lewy otrzyma wartość 0, a każdy kolejny będzie zwiększany o 1.

wyliczenie ( dziesięć=10, trzy=3, cztery, pięć, sześć);

enum (niedziela, poniedziałek, wtorek, środa, czwartek, piątek, sobota) ;

Stałe znakowe to jeden lub dwa znaki ujęte w apostrofy. Stałe znakowe składające się z jednego znaku są typu char i zajmują jeden bajt w pamięci, stałe znakowe składające się z dwóch znaków są typu int i zajmują dwa bajty. Sekwencje zaczynające się od \ nazywane są sekwencjami kontrolnymi i są używane:

— Aby przedstawić symbole, które nie mają prezentacji graficznej, na przykład:

\a – sygnał dźwiękowy,

\b – cofnij się o jeden krok,

\n – przejście do wiersza,

\t – zakładka pozioma.

— Aby reprezentować znaki: \ , ’ , ? , ”(\\, \’ ,\? ,\”).

- Do reprezentowania znaków przy użyciu kodów szesnastkowych lub ósemkowych (\073, \0xF5).

Stała łańcuchowa to ciąg znaków ujętych w cudzysłów. Znaki sterujące można również stosować w ciągu znaków. Na przykład: „\nNowa linia”,

„\n\”Algorytmiczne języki programowania wysokiego poziomu\”” .

Typy danych w C++

Dane wyświetlają otaczający świat w programie. Celem programu jest przetwarzanie danych. Różne typy danych są przechowywane i przetwarzane w różny sposób. Typ danych definiuje:

1) wewnętrzna reprezentacja danych w pamięci komputera;

2) zbiór wartości, jakie mogą przyjmować ilości tego typu;

3) operacje i funkcje, które można zastosować na danych tego typu.

W zależności od wymagań zadania programista wybiera typ obiektów programu. Typy C++ można podzielić na proste i złożone. Typy proste obejmują typy charakteryzujące się pojedynczą wartością. C++ definiuje 6 prostych typów danych:

Istnieją 4 specyfikatory typów, które określają wewnętrzną reprezentację i zakres typów standardowych

krótki

długi

podpisany

niepodpisany

Typwew

Wartości tego typu są liczbami całkowitymi.

Rozmiar typu int nie jest zdefiniowany przez standard, ale zależy od komputera i kompilatora. W przypadku procesora 16-bitowego przydzielone są dla niego 2 bajty, dla procesora 32-bitowego - 4 bajty.

Jeśli specyfikator int jest poprzedzony krótkim specyfikatorem, wówczas na liczbę przydzielane są 2 bajty, a jeśli specyfikator jest długi, to przydzielane są 4 bajty. Ilość pamięci przydzielonej dla obiektu określa zbiór prawidłowych wartości, jakie może przyjąć obiekt:

short int - zajmuje 2 bajty, zatem ma zakres –32768 ..+32767;

long int – zajmuje 4 bajty, zatem ma zakres –2 147 483 648..+2 147 483 647

Typ int jest taki sam, jak krótki typ int na komputerach 16-bitowych i typ long int na komputerach 32-bitowych.

Modyfikatory ze znakiem i bez znaku wpływają również na zestaw prawidłowych wartości, jakie może przyjmować obiekt:

unsigned short int - zajmuje 2 bajty, zatem ma zakres 0..65536;

unsigned long int – zajmuje 4 bajty, zatem ma zakres 0..+4 294 967 295.

Typzwęglać

Wartości tego typu są elementami skończonego uporządkowanego zbioru znaków. Każdemu symbolowi przypisany jest numer, który nazywany jest kodem symbolu. Na wartość typu znakowego przydzielany jest 1 bajt. Typ char może być używany ze specyfikatorami ze znakiem i bez znaku. Dane znaków ze znakiem mogą przechowywać wartości z zakresu od –128 do 127. W przypadku korzystania z danych znaków bez znaku wartości mogą mieścić się w zakresie od 0 do 255. Kodowanie to ASCII (American Standard Code foe International Interchange). Znaki o kodach od 0 do 31 są znakami serwisowymi i mają niezależne znaczenie tylko w instrukcjach I/O.

Wartości typu char służą także do przechowywania liczb z określonych zakresów.

Typwchar_T

Zaprojektowany do pracy z zestawem znaków, dla których 1 bajt nie wystarczy do zakodowania, np. Unicode. Rozmiar tego typu zasadniczo odpowiada typowi krótkiemu. Stałe łańcuchowe tego typu zapisywane są z przedrostkiem L: L„String #1”.

Typbool

Typ bool nazywany jest boolean. Jego wartości mogą przyjmować wartości true i false. Wewnętrzną formą fałszu jest 0, każda inna wartość jest interpretowana jako prawda.

Typy zmiennoprzecinkowe.

Wewnętrzna reprezentacja liczby rzeczywistej składa się z 2 części: mantysy i wykładnika. Na komputerach PC zgodnych z IBM wartości zmiennoprzecinkowe zajmują 4 bajty, z czego jeden bit jest przydzielony na mantysę, 8 bitów na wykładnik i 24 na mantysę.

Podwójne wartości zajmują 8 bajtów, odpowiednio 11 i 52 bity są przydzielane na wykładnik i mantysę. Długość mantysy określa precyzję liczby i długość rzędu jej zakresu.

Jeśli długi specyfikator poprzedza nazwę typu podwójnego, dla wartości przydzielane są bajty.

Typpróżnia

Do głównych typów zalicza się także typ void. Zbiór wartości tego typu jest pusty.

Zmienne

Zmienna w SI++ to nazwany obszar pamięci, w którym przechowywane są dane określonego typu. Zmienna ma nazwę i wartość. Nazwa odnosi się do obszaru pamięci, w którym przechowywana jest wartość. Przed użyciem należy zadeklarować dowolną zmienną. Przykłady:

Ogólny widok operatora opisu:

[klasa pamięci]nazwa typu [inicjator];

Klasa pamięci może przyjmować następujące wartości: auto, extern, static, Register. Klasa pamięci określa czas życia i zakres zmiennej. Jeśli klasa pamięci nie jest określona jawnie, kompilator określa ją na podstawie kontekstu deklaracji. Czas życia może być stały – podczas wykonywania programu lub tymczasowy – podczas bloku. Zakres to część tekstu programu, z której dozwolony jest normalny dostęp do zmiennej. Zazwyczaj zakres jest taki sam jak zakres. Z wyjątkiem przypadku, gdy w bloku wewnętrznym znajduje się zmienna o tej samej nazwie.

Const – wskazuje, że tej zmiennej nie można zmienić (nazywana stałą).

Podczas opisywania można przypisać zmiennej wartość początkową (inicjalizacja).

Klasy pamięci:

auto – automatyczna zmienna lokalna. Specyfikator automatyczny można określić tylko podczas definiowania obiektów blokowych, na przykład w treści funkcji. Zmienne te są przydzielane w pamięci przy wejściu do bloku i zwalniane przy wychodzeniu z niego. Poza blokiem takie zmienne nie istnieją.

extern jest zmienną globalną, znajduje się ona w innym miejscu programu (w innym pliku lub w dalszej części tekstu). Służy do tworzenia zmiennych dostępnych we wszystkich plikach programu.

static jest zmienną statyczną; istnieje tylko w pliku, w którym zmienna jest zdefiniowana.

rejestr - podobny do auto, ale pamięć dla nich jest przydzielana w rejestrach procesora. Jeśli nie jest to możliwe, zmienne są przetwarzane automatycznie.

Int a; //zmienna globalna void main())( int b;//zmienna lokalna extern int x;//zmienna x jest zdefiniowana gdzie indziej static int c;//lokalna zmienna statyczna a=1;//przypisanie do zmiennej globalnej int a; / /zmienna lokalna a a=2;//przypisanie do zmiennej lokalnej::a=3;//przypisanie do zmiennej globalnej ) int x=4;//definicja i inicjalizacja x

W przykładzie zmienna a jest zdefiniowana poza wszystkimi blokami. Zasięg zmiennej a obejmuje cały program, z wyjątkiem tych wierszy, w których używana jest zmienna lokalna a. Zmienne b i c są lokalne, ich zakres jest blokowy. Czas życia jest inny: pamięć dla b jest przydzielana przy wejściu do bloku (ponieważ domyślną klasą pamięci jest auto) i zwalniana przy wyjściu z niego. Zmienna z (static) istnieje podczas działania programu.

Jeżeli wartość początkowa zmiennych nie jest jawnie ustawiona podczas definicji, kompilator resetuje zmienne globalne i statyczne do zera. Zmienne automatyczne nie są inicjalizowane.

Nazwa zmiennej musi być unikalna w swoim zakresie.

Deklarację zmiennej można wykonać albo jako deklarację, albo jako definicję. Deklaracja zawiera informację o klasie pamięci i typie zmiennej; definicja wraz z tą informacją instruuje o alokacji pamięci. W przykładzie extern int x; - deklaracja, a reszta - definicje.

Znaki operacji w C++

Znaki operacyjne zapewniają tworzenie wyrażeń. Wyrażenia składają się z operandów, symboli operatorów i nawiasów. Każdy operand jest z kolei wyrażeniem lub szczególnym przypadkiem wyrażenia - stałą lub zmienną.

Operacje jednoargumentowe

& uzyskanie adresu operandu
* Odwoływanie się do adresu (dereferencja)
minus jednoargumentowy, zmienia znak operandu arytmetycznego
~ bitowa inwersja wewnętrznego kodu binarnego operandu całkowitego (negacja bitowa)
! logiczna negacja (NIE). 0 jest fałszywe, a nie-0 jest prawdziwe, negacja 0 wynosi 1, negacja dowolnej liczby niezerowej wynosi 0.
++ Zwiększ o jeden:

operacja przedrostkowa - zwiększa operand przed jego użyciem,

Operator postfiksowy zwiększa operand po jego użyciu.

int a=(m++)+n; // a=4,m=2,n=2

int b=m+(++n);//a=3,m=1,n=3

— — zmniejsz o jeden:

operacja przedrostkowa - redukuje operand przed jego użyciem,

Operator postfiksowy zmniejsza operand po jego użyciu.

rozmiar obliczanie rozmiaru (w bajtach) obiektu typu, który ma operand

ma dwie formy

wielkość wyrażenia

sizeof(float)//4

sizeof(1.0)//8, ponieważ stałe rzeczywiste są domyślnie typu double

Operacje binarne.

Przyłączeniowy:

Mnożny:

Operacje przesunięcia (zdefiniowane tylko dla operandów całkowitych).

Format wyrażenia z operacją przesunięcia:

operacja przesunięcia lewego argumentu prawy argument

Operacje bitowe:

Operacje porównania: wynik jest prawdziwy (nie 0) lub fałszywy (0)

Logiczne operacje binarne:

Operatory przypisania

Itp.

Prosty format przypisania:

operand1=operand2

Wartość z lewej strony (wartość L) to wyrażenie odnoszące się do określonego obszaru pamięci, tj. Można w nim przechowywać wartość. Nazwa ta pochodzi od operacji przypisania, ponieważ to lewa strona operacji przypisania określa, w którym obszarze pamięci zostanie zapisany wynik operacji. Zmienna jest szczególnym przypadkiem wyrażenia dopuszczalnego z lewej strony.

Działanie warunkowe.

W przeciwieństwie do operacji jednoargumentowych i binarnych używa trzech operandów.

Wyrażenie 1? Wyrażenie2: Wyrażenie3;

Najpierw obliczana jest wartość wyrażenia 1. Jeśli jest prawdziwy, to wartość wyrażenia2 jest oceniana i staje się wynikiem. Jeżeli przy ocenie wyrażenia 1 zostanie uzyskane 0, wówczas jako wynik zostanie przyjęta wartość wyrażenia 3.

Na przykład:

X<0 ? -x: x ; //вычисляется абсолютное значение x.

Jawna operacja rzutowania typu (konwersji).

Istnieją dwie formy: kanoniczna i funkcjonalna:

1) operand (nazwa_typu).

2) nazwa_typu (operand)

(int)a //forma kanoniczna

int(a) //forma funkcjonalna

Wyrażenia

Można konstruować wyrażenia na podstawie stałych, zmiennych, ograniczników i symboli operatorów. Każde wyrażenie reprezentuje regułę obliczania nowej wartości. Jeśli wyrażenie tworzy liczbę całkowitą lub rzeczywistą, nazywa się je arytmetyką. Para wyrażeń arytmetycznych połączonych operacją porównania nazywana jest relacją. Jeśli relacja ma wartość różną od zera, to jest prawdziwa, w przeciwnym wypadku jest fałszywa.

Pierwszeństwo operatorów w wyrażeniach

Stopień Operacje
1 () -> .
2 ! ~ - ++ - & * (typ) rozmiar typu()
3 */% (plik binarny multiplikatywny)
+ — (dodatek binarny)
5 << >> (przesunięcie bitowe)
6 < > <= >= (związek)
7 == != (relacje)
8 & (spójnik bitowy „AND”)
9 ^ (bitowo wyłączne „LUB”)
10 | (bitowa dysjunkcja „OR”)
11 && (spójnik „AND”)
12 || (alternatywa „OR”)
13 ?: (operacja warunkowa)
14 = *= /= %= -= &= ^= |= <<= >>= (operator przypisania)
15 , (operacja przecinkiem)


Jeśli zauważysz błąd, zaznacz fragment tekstu i naciśnij Ctrl+Enter
UDZIAŁ: