C operater ili u stanju. Logički operatori u C-u. Skraćeni logički operatori


Bilješka. Sve operacije rezultiraju vrijednošću tipa bool

Usporedba i logičke operacije rezultiraju vrijednošću tipa bool, to jest, true ili false. Ako se takav izraz pojavi u kontekstu koji zahtijeva cjelobrojnu vrijednost, true se pretvara u 1, a false se pretvara u 0. Ovdje je dio koda koji broji broj elemenata vektora koji su manji od neke zadane vrijednosti:

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

Jednostavno dodajemo rezultat operacije manje u brojač. (Par += označava složeni operator dodjele koji dodaje operand s lijeve i operand s desne strane. Istu stvar možemo napisati kompaktnije: elem_count = elem_count + n. Pogledat ćemo takve operatore u odjeljku 4.4. )
Logičko I (&&) vraća istinito samo kada su oba operanda istinita. Logički ILI (||) daje vrijednost true ako je barem jedan od njegovih operanda istinit. Zajamčeno je da se operandi procjenjuju slijeva na desno i procjena završava čim je poznata rezultirajuća vrijednost. Što to znači? Neka su dana dva izraza:

Izraz1 && izraz2 izraz1 || izraz2

Ako je u prvom od njih expr1 false, vrijednost cijelog izraza također će biti false, bez obzira na vrijednost expr2, koja se neće niti evaluirati. U drugom izrazu, izraz2 se ne procjenjuje ako je izraz1 istinit jer se cijeli izraz procjenjuje kao istinit bez obzira na izraz2.
Ova metoda izračuna omogućuje prikladno testiranje nekoliko izraza u jednom operatoru AND:

Dok (ptr != O && ptr->va1ue< upperBound && ptr->va1ue >= 0 && notFound(ia[ ptr->va1ue ])) ( ... )

Nulti pokazivač ne pokazuje ni na jedan objekt, pa bi primjena operacije pristupa članu na nulti pokazivač uzrokovala pogrešku (ptr->vrijednost). Međutim, ako je ptr 0, provjera u prvom koraku zaustavlja daljnju procjenu podizraza. Slično, u drugom i trećem koraku, provjerava se da je vrijednost ptr->value u traženom rasponu, a operacija uzimanja indeksa se ne primjenjuje na niz ia ako ovaj indeks nije točan.
Logička NOT operacija daje vrijednost true ako je njen jedini operator false, i obrnuto. Na primjer:

Bool pronađen = false; // dok se element ne pronađe // i ptr pokazuje na objekt (ne 0) dok (! pronađeno && ptr) ( pronađeno = 1lookup(*ptr); ++ptr; )

Podizraz

Vraća true ako je pronađeno lažno. Ovo je kompaktniji zapis za

Pronađeno == lažno

Također

Ekvivalent duljem unosu

Ako (pronađeno == istina)

Upotreba operacija usporedbe sasvim je očita. Samo trebate imati na umu da, za razliku od I i ILI, redoslijed kojim se operandi takvih izraza vrednuju nije definiran. Evo primjera gdje je takva pogreška moguća:

// Pažnja! Redoslijed izračuna nije definiran! if (ia[ index++ ]< ia[ index ]) // поменять местами элементы

Programer je pretpostavio da je lijevi operand prvi procijenjen i da će se elementi ia i ia usporediti. Međutim, prevodilac ne jamči procjenu slijeva nadesno, u kojem slučaju se element ia može usporediti sam sa sobom. Mnogo je bolje napisati razumljiviji i o stroju neovisan kod:

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

Još jedan primjer moguće pogreške. Htjeli smo biti sigurni da su sve tri vrijednosti ival, jval i kval različite. Gdje smo pogriješili?

// Pažnja! ovo nije usporedba 3 varijable jedna s drugom ako (ival != jva1 != kva1) // učini nešto ...

Vrijednosti 0, 1 i 0 daju vrijednost true. Zašto? Prvo se provjerava ival != jval, a zatim se rezultat ove provjere (true/false - pretvoren u 1/0) uspoređuje s kval. Trebali smo eksplicitno napisati:
ako (ival != jva1 && ival != kva1 && jva1 != kva1)
// napraviti nešto...

Vježba 4.4

Pronađite netočne ili nepodnošljive izraze i objasnite. Kako se mogu promijeniti? (Imajte na umu da vrste objekata ne igraju ulogu u ovim primjerima.)
(a) ptr->iva1 != 0
(c) ptr != 0 && *ptr++
(e)vec[iva1++]<= vec[ ival ];
(b) ival != jva1< kva1 (d) iva1++ && ival

Vježba 4.5

Jezik C++ ne diktira redoslijed kojim se evaluiraju operacije usporedbe kako bi se kompilatoru omogućilo da to učini na optimalan način. Mislite li da bi u ovom slučaju bilo vrijedno žrtvovati učinkovitost kako bismo izbjegli zamke pretpostavke da se izrazi procjenjuju slijeva nadesno?

Budući da sam u prošlom članku prvi put koristio logičku operaciju, reći ću vam što su, koliko ih ima i kako ih koristiti.

Postoje tri logičke operacije u C++:

  1. Logička operacija AND && već nam je poznata;
  2. Logička operacija ILI || ;
  3. Logička operacija NE ! ili logička negacija.

Logičke operacije tvore složeni (složeni) uvjet od nekoliko jednostavnih (dva ili više) uvjeta. Ove operacije nekoliko puta pojednostavljuju strukturu programskog koda. Da, možete i bez njih, ali tada se broj if-ova povećava nekoliko puta, ovisno o uvjetima. Sljedeća tablica ukratko opisuje sve logičke operacije u programskom jeziku C++ za konstruiranje logičkih uvjeta.

Sada biste trebali razumjeti razliku između logičke operacije I i logičke operacije ILI kako ne biste bili zbunjeni u budućnosti. Vrijeme je da se upoznate s tipom podataka bool– logično. Ova vrsta podataka može imati dvije vrijednosti: istinito i lažno. Uvjet koji se testira u izjavama odabira ima tip podataka bool. Razmotrimo princip rada sljedećeg programa i sve će biti jasno sa svim ovim logičkim operacijama.

// or_and_not.cpp: Definira ulaznu točku za aplikaciju konzole. #include "stdafx.h" #include korištenje imenskog prostora std; int main(int argc, char* argv) ( bool a1 = true, a2 = false; // deklaracija boolean varijabli 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; }

Redci 9 i 10trebalo bi vam biti jasno, jer se ovdje inicijaliziraju varijable tipa bool . Štoviše, svakoj varijabli je dodijeljena vrijednost istina ili laž . Počevši od 9. redak i završetak 20, pokazuje korištenje logičkih operacija. Rezultat programa (vidi sliku 1).

Tablica istinitosti dnevnika operacija && točno && lažno: 0 lažno && točno: 0 točno && točno: 1 lažno && lažno: 0 Tablica istinitosti dnevnika operacija || istina || lažno: 1 lažno || točno: 1 točno || točno: 1 netočno || false: 0 Tablica istinitosti log operacije ! !true: 0 !false: 1 Za nastavak pritisnite bilo koju tipku. . .

Slika 1 - C++ logičke operacije

Vjerojatno imate pitanje: "Što su ove nule i jedinice?" Ako postoji pitanje, onda na njega treba odgovoriti. Odgovaram: "Nula je prikaz logičke vrijednosti laž, a jedinice su logička vrijednost istina." Dopustite mi da ukratko objasnim neke točke. Složeni uvjet pomoću Booleove vrijednosti I je istinit samo ako su oba prosta uvjeta istinita. U svim ostalim slučajevima, složeni uvjet je lažan. Složeni uvjet koji koristi logički ILI je lažan samo ako su oba jednostavna uvjeta lažna. U svim ostalim slučajevima, složeni uvjet je istinit. Logička negacija NE je unarni operator i ne kombinira dva uvjeta, za razliku od logičkih operatora I I ILI, koje su binarne operacije. Logička negacija omogućuje vam da obrnete značenje uvjeta, što je u nekim slučajevima vrlo zgodno. Uvjet s logičkom negacijom je istinit ako je isti uvjet lažan bez negacije, i obrnuto.

U tekstu na bilo kojem prirodnom jeziku postoje četiri glavna elementa: simboli, riječi, fraze i rečenice. Algoritamski jezik također sadrži takve elemente, samo se riječi nazivaju leksemi (elementarne konstrukcije), izrazi se nazivaju izrazi, a rečenice se nazivaju operatori. Tokeni se formiraju od simbola, izrazi od tokena i simbola, operatori od simbola izraza i tokena (Sl. 1.1)

Riža. 1.1. Kompozicija algoritamskog jezika

Dakle, elementi algoritamskog jezika su:

1) Abeceda jezika SI++, koje uključuje

- velika i mala latinična slova i podvlaka;

— arapski brojevi od 0 do 9;

— posebni znakovi “(),| ()+-/%*.\’:;&?<>=!#^

— razmaci (razmak, tabulator, znakovi za novi red).

2) Jezični leksemi tvore se od simbola:

Identifikatori– imena SI programskih objekata. Identifikator može koristiti latinična slova, brojeve i podvlake. Velika i mala slova su različita, na primjer PROG1, prog1 i Prog1 tri su različita identifikatora. Prvi znak mora biti slovo ili podvlaka (ne broj). Razmaci u identifikatorima nisu dopušteni.

Ključ(rezervirane) riječi su riječi koje sastavljaču imaju posebno značenje. Ne mogu se koristiti kao identifikatori.

— Znakovi operacije su jedan ili više simbola koji definiraju radnju na operandima. Operacije se dijele na unarne, binarne i ternarne prema broju operanda uključenih u ovu operaciju.

Konstante– to su nepromjenjive veličine. Postoje cjelobrojne, realne, znakovne i string konstante. Prevoditelj identificira konstantu kao leksem (elementarni konstrukt) i dodjeljuje je jednom od tipova na temelju njezina izgleda.

Separatori– zagrade, točka, zarez, razmak.

Konstante u C++

Konstantno je token koji predstavlja sliku fiksne numeričke, nizovne ili znakovne vrijednosti.

Konstante su podijeljene u 5 grupa:

— real (pokretni zarez);

- nabrojiv;

- simbolički;

- niz.

Prevoditelj odabire leksem i pridružuje ga jednoj ili drugoj skupini, a zatim unutar skupine određenom tipu na temelju njegovog oblika u tekstu programa i njegove brojčane vrijednosti.

Cjelobrojne konstante mogu biti decimalne, oktalne ili heksadecimalne. Decimalna konstanta definirana je kao niz decimalnih znamenki koje počinju s nečim što nije 0 osim ako taj broj nije 0 (primjeri: 8, 0, 192345). Oktalna konstanta je konstanta koja uvijek počinje s 0. Nakon 0 slijede oktalne znamenke (primjeri: 016 - decimalna vrijednost 14, 01). Heksadecimalne konstante su niz heksadecimalnih znamenki kojima prethode znakovi 0x ili 0X (primjeri: 0xA, 0X00F).

Ovisno o vrijednosti cjelobrojne konstante, prevodilac će je različito prikazati u memoriji računala (to jest, prevodilac će konstanti dodijeliti odgovarajući tip podataka).

Realne konstante imaju drugačiji oblik interne reprezentacije u memoriji računala. Prevodilac prepoznaje takve konstante po njihovom tipu. Realne konstante mogu imati dva oblika reprezentacije: fiksni i pokretni zarez. Tip konstante s fiksnim zarezom: [znamenke].[znamenke] (primjeri: 5.7, .0001, 41.). Tip konstante s pomičnim zarezom: [znamenke][.][znamenke]E|e[+|-][znamenke ] (primjeri: 0.5e5, .11e-5, 5E3). U pisanju realnih konstanti mogu se izostaviti cijeli ili razlomački dijelovi, decimalna točka ili znak eksponenta uz eksponent.

Prebrojive konstante uvode se pomoću ključne riječi enum. To su obične cjelobrojne konstante kojima su dodijeljene jedinstvene oznake jednostavne za korištenje. Primjeri: enum (one=1, two=2, three=3, four=4);

enum (nula, jedan, dva, tri) – ako izostavite znakove = i numeričke vrijednosti u definiciji nabrojanih konstanti, tada će vrijednosti biti dodijeljene prema zadanim postavkama. U tom slučaju, krajnji lijevi identifikator dobit će vrijednost 0, a svaki sljedeći će se povećati za 1.

enum ( deset=10, tri=3, četiri, pet, šest);

enum (nedjelja, ponedjeljak, utorak, srijeda, četvrtak, petak, subota) ;

Znakovne konstante su jedan ili dva znaka okružena apostrofima. Znakovne konstante koje se sastoje od jednog znaka su tipa char i zauzimaju jedan bajt u memoriji, karakterne konstante koje se sastoje od dva znaka su tipa int i zauzimaju dva bajta. Nizovi koji počinju sa \ nazivaju se kontrolni nizovi i koriste se:

— Za predstavljanje simbola koji nemaju grafički prikaz, na primjer:

\a – zvučni signal,

\b – povratak jedan korak,

\n – novi redak,

\t – horizontalni jezičak.

— Za predstavljanje znakova: \ , ’ , ? , ”(\\, \’ ,\? ,\”).

- Za predstavljanje znakova pomoću heksadecimalnih ili oktalnih kodova (\073, \0xF5).

String konstanta je niz znakova unutar navodnika. Kontrolni znakovi također se mogu koristiti unutar nizova. Na primjer: “\nNovi red”,

“\n\”Algoritamski programski jezici visoke razine\”” .

Vrste podataka u C++

Podaci prikazuju okolni svijet u programu. Svrha programa je obrada podataka. Različite vrste podataka različito se pohranjuju i obrađuju. Tip podataka definira:

1) interni prikaz podataka u memoriji računala;

2) skup vrijednosti koje količine ove vrste mogu poprimiti;

3) operacije i funkcije koje se mogu primijeniti na podatke ove vrste.

Ovisno o zahtjevima zadatka, programer odabire vrstu programskih objekata. C++ tipovi se mogu podijeliti na jednostavne i složene. Jednostavni tipovi uključuju tipove koje karakterizira jedna vrijednost. C++ definira 6 jednostavnih tipova podataka:

Postoje 4 specifikatora tipa koji specificiraju interni prikaz i raspon standardnih tipova

kratak

dugo

potpisan

nepotpisan

Tipint

Vrijednosti ovog tipa su cijeli brojevi.

Veličina tipa int nije definirana standardom, već ovisi o računalu i kompajleru. Za 16-bitni procesor dodijeljena su mu 2 bajta, za 32-bitni procesor - 4 bajta.

Ako ispred int-a stoji kratki specifikator, tada se za broj dodjeljuju 2 bajta, a ako je specifikator dug, tada se dodjeljuju 4 bajta. Količina memorije dodijeljena objektu određuje skup valjanih vrijednosti koje objekt može uzeti:

short int - zauzima 2 bajta, stoga ima raspon od –32768 ..+32767;

long int – zauzima 4 bajta, stoga ima raspon od –2,147,483,648..+2,147,483,647

Tip int isti je kao tip short int na 16-bitnim računalima i tip long int na 32-bitnim računalima.

Modifikatori s predznakom i bez predznaka također utječu na skup valjanih vrijednosti koje objekt može uzeti:

unsigned short int - zauzima 2 bajta, stoga ima raspon od 0 ..65536;

unsigned long int – zauzima 4 bajta, stoga ima raspon od 0..+4 294 967 295.

Tipchar

Vrijednosti ovog tipa su elementi konačnog uređenog skupa znakova. Svakom znaku dodijeljen je broj koji se naziva šifra znaka. 1 bajt je dodijeljen za vrijednost tipa znaka. Tip char može se koristiti s predpisanim i nepredpisanim specifikatorima. Signed char podaci mogu pohraniti vrijednosti u rasponu od –128 do 127. Kada se koriste nesigned char podaci, vrijednosti mogu biti u rasponu od 0 do 255. Kodiranje je ASCII (American Standard Code foe International Interchange). Znakovi s kodovima od 0 do 31 su uslužni znakovi i imaju neovisno značenje samo u I/O izjavama.

Vrijednosti tipa char također se koriste za pohranu brojeva iz navedenih raspona.

Tipwchar_t

Dizajniran za rad sa skupom znakova za koje 1 bajt nije dovoljan za kodiranje, na primjer Unicode. Veličina ovog tipa općenito odgovara kratkom tipu. String konstante ovog tipa pišu se s L prefiksom: L“String #1”.

Tipbool

Tip bool naziva se boolean. Njegove vrijednosti mogu imati vrijednosti true i false. Interni oblik false je 0, svaka druga vrijednost se tumači kao true.

Tipovi s pomičnim zarezom.

Interni prikaz realnog broja sastoji se od 2 dijela: mantise i eksponenta. Na IBM-kompatibilnim osobnim računalima, float vrijednosti zauzimaju 4 bajta, od kojih je jedan bit dodijeljen za mantisu, 8 bita za eksponent i 24 za mantisu.

Dvostruke vrijednosti zauzimaju 8 bajtova, 11 i 52 bita dodijeljeno je eksponentu, odnosno mantisi. Duljina mantise određuje preciznost broja, a duljina reda njegovog raspona.

Ako dugi specifikator prethodi nazivu dvostrukog tipa, bajtovi se dodjeljuju za vrijednost.

Tipponištiti

Glavni tipovi također uključuju void tip. Skup vrijednosti ovog tipa je prazan.

Varijable

Varijabla u SI++ je imenovano područje memorije koje pohranjuje podatke određene vrste. Varijabla ima ime i vrijednost. Naziv se koristi za označavanje memorijskog područja u kojem je vrijednost pohranjena. Prije upotrebe, svaka varijabla mora biti deklarirana. Primjeri:

Opći prikaz operatora opisa:

[klasa memorije]ime tipa [inicijalizator];

Klasa memorije može imati sljedeće vrijednosti: auto, extern, static, register. Klasa memorije određuje životni vijek i opseg varijable. Ako memorijska klasa nije eksplicitno specificirana, kompajler ju određuje na temelju konteksta deklaracije. Životni vijek može biti trajan - tijekom izvođenja programa ili privremen - tijekom bloka. Opseg je dio programskog teksta iz kojeg je dopušten normalan pristup varijabli. Opseg je obično isti kao i opseg. Osim u slučaju kada u unutarnjem bloku postoji varijabla s istim imenom.

Const – označava da se ova varijabla ne može mijenjati (nazvana konstanta).

Prilikom opisivanja varijabli možete dodijeliti početnu vrijednost (inicijalizacija).

Klase pamćenja:

auto – automatska lokalna varijabla. Automatski specifikator može se specificirati samo kada se definiraju objekti bloka, na primjer, u tijelu funkcije. Ovim se varijablama memorija dodjeljuje prilikom ulaska u blok i oslobađa se prilikom izlaska iz njega. Izvan bloka takve varijable ne postoje.

extern je globalna varijabla, nalazi se na drugom mjestu u programu (u drugoj datoteci ili niže u tekstu). Koristi se za stvaranje varijabli koje su dostupne u svim programskim datotekama.

static je statička varijabla; postoji samo unutar datoteke u kojoj je varijabla definirana.

register - slično kao auto, ali je memorija za njih dodijeljena u registrima procesora. Ako to nije moguće, tada se varijable obrađuju kao auto.

Int a; //globalna varijabla void main())( int b;//lokalna varijabla extern int x;//varijabla x definirana je drugdje static int c;//lokalna statička varijabla a=1;//dodjela globalnoj varijabli int a; / /lokalna varijabla a a=2;//dodjela lokalnoj varijabli::a=3;//dodjela globalnoj varijabli ) int x=4;//definicija i inicijalizacija x

U primjeru je varijabla a definirana izvan svih blokova. Opseg varijable a je cijeli program, osim onih linija u kojima se koristi lokalna varijabla a. Varijable b i c su lokalne, njihov opseg je blok. Životni vijek je drugačiji: memorija za b se dodjeljuje pri ulasku u blok (budući da je zadana klasa memorije auto), a oslobađa se pri izlasku iz njega. Varijabla sa (static) postoji dok se program izvodi.

Ako početna vrijednost varijabli nije eksplicitno postavljena tijekom definicije, prevodilac resetira globalne i statičke varijable na nulu. Automatske varijable nisu inicijalizirane.

Naziv varijable mora biti jedinstven unutar svog opsega.

Deklaracija varijable može se napraviti ili kao deklaracija ili kao definicija. Deklaracija sadrži informacije o memorijskoj klasi i tipu varijable; definicija, zajedno s tim informacijama, upućuje na memoriju koju treba dodijeliti. U primjeru extern int x; - deklaracija, a ostalo - definicije.

Operacijski znakovi u C++

Operacijski znakovi osiguravaju oblikovanje izraza. Izrazi se sastoje od operanda, simbola operatora i zagrada. Svaki operand je pak izraz ili poseban slučaj izraza - konstanta ili varijabla.

Unarne operacije

& dobivanje adrese operanda
* Pozivanje na adresu (dereferenciranje)
unarni minus, mijenja predznak aritmetičkog operanda
~ bitna inverzija internog binarnog koda cjelobrojnog operanda (bitna negacija)
! logička negacija (NE). 0 je netočno, a ne-0 je istinito, negacija 0 je 1, negacija bilo kojeg broja koji nije nula je 0.
++ Povećaj za jedan:

operacija prefiksa - povećava operand prije nego što se koristi,

Postfiksni operator povećava operand nakon što je korišten.

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

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

— — smanji za jedan:

operacija prefiksa - smanjuje operand prije nego što se koristi,

Postfiksni operator dekrementira operand nakon što je korišten.

veličina izračunavanje veličine (u bajtovima) objekta tipa koji ima operand

ima dva oblika

veličina izraza

sizeof(float)//4

sizeof(1.0)//8, budući da su stvarne konstante dvostrukog tipa prema zadanim postavkama

Binarne operacije.

Aditiv:

Multiplikativ:

Operacije pomaka (definirane samo za cjelobrojne operande).

Format izraza s operacijom pomaka:

operacija pomaka lijevog operanda desni operand

Operacije po bitovima:

Operacije usporedbe: rezultat je istinit (ne 0) ili lažan (0)

Logičke binarne operacije:

Operatori dodjele

itd.

Jednostavan format zadatka:

operand1=operand2

Lijevo valjana vrijednost (L-vrijednost) je izraz koji se odnosi na određeno područje memorije, tj. u njemu se može pohraniti vrijednost. Ovaj naziv dolazi od operacije dodjele, budući da je lijeva strana operacije dodjele ta koja određuje u kojem će memorijskom području biti pohranjen rezultat operacije. Varijabla je poseban slučaj lijevo dopustivog izraza.

Uvjetni rad.

Za razliku od unarnih i binarnih operacija, koristi tri operanda.

Izraz1 ? Izraz2: Izraz3;

Prvo se izračunava vrijednost izraza1. Ako je istina, tada se vrijednost izraza2 procjenjuje i postaje rezultat. Ako se pri vrednovanju izraza1 dobije 0, tada se vrijednost izraza3 uzima kao rezultat.

Na primjer:

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

Operacija eksplicitnog (pretvorbenog) pretvaranja tipa.

Postoje dva oblika: kanonski i funkcionalni:

1) (type_name) operand

2) type_name (operand)

(int)a //kanonski oblik

int(a) //funkcionalni oblik

Izrazi

Možete konstruirati izraze od konstanti, varijabli, graničnika i simbola operatora. Svaki izraz predstavlja pravilo za izračunavanje nove vrijednosti.Ako izraz tvori cijeli ili realni broj, onda se zove aritmetika. Par aritmetičkih izraza spojenih operacijom usporedbe naziva se relacija. Ako relacija ima vrijednost različitu od nule, tada je istinita, u protivnom je lažna.

Prednost operatora u izrazima

Rang Operacije
1 () -> .
2 ! ~ - ++ - & * (tip) veličina tipa()
3 */% (multiplikativni binarni)
+ — (aditivni binarni)
5 << >> (pomak bita)
6 < > <= >= (odnos)
7 == != (odnosi)
8 & (bitna konjunkcija "I")
9 ^ (isključivo "ILI")
10 | (bitna disjunkcija “ILI”)
11 && (veznik "I")
12 || (disjunkcija “ILI”)
13 ?: (uvjetna operacija)
14 = *= /= %= -= &= ^= |= <<= >>= (operator dodjele)
15 , (operacija sa zarezom)

Bilo koji jezični izraz sastoji se od operanda (varijabli, konstanti itd.) povezanih operacijskim znakovima. Znak operacije je simbol ili skupina simbola koji prevoditelju govore da izvrši određene aritmetičke, logičke ili druge operacije.

Operacije se izvode u strogom slijedu. Vrijednost koja određuje pravo prvenstva za izvođenje određene operacije naziva se prioritet. U tablici 2 navodi različite operacije SI (C) jezika. Njihovi prioriteti za svaku grupu su isti (skupine su označene bojom). Što odgovarajuća grupa operacija ima veću prednost, to se nalazi više u tablici. Redoslijed operacija može se kontrolirati pomoću zagrada.

Tablica 2 - operacije

Znak operacije

Svrha operacije

Pozivanje funkcije

Odabir elementa niza

Odabir elementa zapisa

Odabir elementa zapisa

Logička negacija

Bitna negacija

Promjena predznaka

Povećaj za jedan

Smanji za jedan

Uzimanje adrese

Kontakt adresa

Pretvorba tipa (tj. (float)a)

Određivanje veličine u bajtovima

Množenje

Određivanje ostatka dijeljenja

Dodatak

Oduzimanje

Pomak ulijevo

Pomak udesno

Manje od

Manje ili jednako

Više od

Više ili jednako

Bitno logički "I"

Bitno isključivi "ILI"

Bitno logično "ILI"

Logički "I"

Logički "ILI"

Uvjetna (ternarna) operacija

Zadatak

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

Binarne operacije (na primjer, a *= b
(tj. a = a * b), itd.)

Operacija zarez

Operator u jeziku C (C)

Kako bismo izbjegli zabunu u pojmovima "operacija" i "operator", napominjemo da je operator najmanja izvršna jedinica programa. Postoje izrazni operatori čiji je učinak procjena danih izraza (na primjer: a = sin(b)+c; j++;), deklaracijski operatori, složeni operatori, prazni operatori, operatori oznaka, operatori petlje, itd. SI (C) jezik koristi točku i zarez za označavanje kraja izjave. Za složeni iskaz (ili blok), koji je skup logički povezanih iskaza smještenih između otvarajućih (() i zatvarajućih ()) vitičastih zagrada ("zagrada iskaza"), ne slijedi točka i zarez. Imajte na umu da se blok razlikuje od složene izjave po prisutnosti definicija u tijelu bloka.

Karakteristike osnovnih operacija jezika C (C)

Obilježimo osnovne operacije SI (C) jezika.

Operator dodjele

Prvo, pogledajmo jedan od njih - operator dodjele (=). Izražavanje oblika

varijabli x dodjeljuje vrijednost varijable y. Operator "=" može se koristiti više puta u jednom izrazu, na primjer:

x = y = z = 100;

Postoje unarne i binarne operacije. Prvi od njih ima jedan operand, a drugi dva. Započnimo naše razmatranje operacijama koje su klasificirane u prvu od sljedećih tradicionalnih skupina:

Aritmetičke operacije.

Logičke i relacijske operacije.

Operacije s bitovima.

Aritmetičke operacije su označene sljedećim simbolima (Tablica 2): +, -, *, /, %. Posljednji od njih ne može se primijeniti na varijable realnog tipa. Na primjer:

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

Logičke operacije

Logičke relacijske operacije navedene su sljedećim simbolima (vidi tablicu 2): && (“I”), || ("ILI"), ! ("NE"), >, >=,<, <= , = = (равно), != (не равно). Традиционно эти операции должны давать одно из двух значений: истину или ложь. В языке СИ (C)принято следующее правило: истина - это любое ненулевое значение; ложь - это нулевое значение. Выражения, использующие логические операции и операции отношения, возвращают 0 для ложного значения и 1 для истинного. Ниже приводится таблица истинности для логических операций.

Bitne operacije mogu se primijeniti na varijable tipa int, char i njihove varijante (na primjer, long int). Ne mogu se primijeniti na varijable tipova float, double, void (ili složenijih tipova). Ove operacije specificirane su sljedećim simbolima: ~ (bitna negacija),<< (сдвиг влево), >> (desni pomak), & (bitno I), ^ (bitno XOR), | (bitno "ILI").

Primjeri: ako je a=0000 1111 i b=1000 1000, tada

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

Jezik nudi dvije netradicionalne operacije: inkrement (++) i dekrement (--). Osmišljeni su za povećanje i smanjenje vrijednosti operanda za jedan. Operacije ++ i -- mogu se napisati prije ili iza operanda. U prvom slučaju (++n ili --n), vrijednost operanda (n) se mijenja prije nego što se koristi u odgovarajućem izrazu, au drugom (n++ ili n--) - nakon njegove upotrebe. Razmotrite sljedeće dvije linije programa:

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

Pretpostavimo da je b = b1 = 2, c = c1 = 4. Tada nakon izvođenja operacija: a = 6, b = 2, c = 5, a1 = 7, b1 = 2, c1 = 5.

Izrazi s drugim netradicionalnim ternarnim ili uvjetnim operatorom također su rašireni: . U formuli

y = a ako x nije nula (tj. istinito), i y = b ako je x nula (netočno). Sljedeći izraz

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

omogućuje vam da varijabli y dodijelite vrijednost veće varijable (a ili b), tj. y = max(a, b).

Još jedna razlika u jeziku je da izraz oblika a = a + 5; može se napisati u drugom obliku: a += 5;. Umjesto znaka + možete koristiti i simbole drugih binarnih operacija (vidi tablicu 2).

Ostale operacije iz tab. 2 bit će opisan u sljedećim paragrafima.

Petlje su organizirane za izvođenje određene naredbe ili grupe naredbi određeni broj puta. U SI (C) jeziku postoje tri naredbe za petlju: for, while i do - while. Prvi od njih je formalno napisan na sljedeći način:

za (izraz_1; izraz_2; izraz_3) tijelo_petlje

Tijelo petlje sastoji se od jedne naredbe ili nekoliko naredbi u vitičastim zagradama ( ... ) (nema točke-zareza nakon bloka). Izrazi 1, 2, 3 sadrže posebnu varijablu koja se naziva kontrolna varijabla. Na temelju njegove vrijednosti utvrđuje se potreba ponavljanja ciklusa ili izlaska iz njega.

Expression_1 dodjeljuje početnu vrijednost kontrolnoj varijabli, Expression_3 je mijenja u svakom koraku, a Expression_2 provjerava je li dosegla graničnu vrijednost koja diktira treba li petlja izaći.

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

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

/* Petlja će se izvoditi sve dok tipkovnica

znak "p" neće biti upisan */

Bilo koji od tri izraza može nedostajati u for petlji, ali točka-zarez mora ostati. Dakle, for (; ;) (...) je beskonačna petlja iz koje se može izaći samo na druge načine.

Sljedeće pravilo je prihvaćeno u SI (C) jeziku. Svaki izraz dodjele u zagradama ima vrijednost dodjele. Na primjer, izraz (a=7+2) ima vrijednost 9. Nakon toga možete napisati još jedan izraz, na primjer: ((a=7+2)<10), которое в данном случае будет всегда давать истинное значение. Следующая конструкция:

((sh = getch()) == "i")

omogućuje unos vrijednosti varijable ch i daje pravi rezultat samo kada je unesena vrijednost slovo "i". Također možete napisati nekoliko formula koje čine složeni izraz u zagradama. U ove svrhe koristi se operator zarez. Formule će se procjenjivati ​​slijeva na desno, a cijeli izraz će imati vrijednost posljednje procijenjene formule. Na primjer, ako postoje dvije varijable tipa char, onda izraz

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

definira sljedeće akcije: vrijednost varijable y dodjeljuje se varijabli x; znak se unosi s tipkovnice i dodjeljuje varijabli y; z dobiva vrijednost varijable y. Zagrade su ovdje neophodne jer operacija zarez ima manji prioritet od operacije dodjele zapisane iza varijable z. Operacija zarez široko se koristi za konstrukciju izraza petlje for i omogućuje vam paralelnu promjenu vrijednosti nekoliko kontrolnih varijabli.

Dopuštene su ugniježđene strukture, tj. U tijelu petlje mogu postojati i druge for naredbe.

Naredba while je formalno napisana na sljedeći način:

dok (izraz) tijelo_petlje

Izraz u zagradama može imati različitu od nule (točno) ili nultu (netočno) vrijednost. Ako je istina, tada se tijelo petlje izvršava i izraz se ponovno procjenjuje. Ako je izraz lažan, while petlja završava.

Naredba do-while formalno je napisana na sljedeći način:

do (tijelo_petlje) dok (izraz);

Glavna razlika između while petlje i do - while petlje je da se tijelo u do - while petlji izvršava barem jednom. Tijelo petlje će se izvršavati sve dok izraz u zagradama ne dobije vrijednost false. Ako je false prilikom ulaska u petlju, tada se njegovo tijelo izvršava točno jednom.

Dopušteno je ugniježditi neke cikluse unutar drugih, tj. Operatori for, while i do - while se mogu pojaviti u tijelu bilo koje petlje.

Novi operatori break i continue mogu se koristiti u tijelu petlje. Operator break osigurava trenutačni izlazak iz petlje, operator continue uzrokuje prekid sljedeće iteracije i početak sljedeće iteracije.

Operatori uvjetnog i bezuvjetnog skoka

Za organizaciju uvjetnih i bezuvjetnih prijelaza u programu u SI (C) jeziku koriste se sljedeći operatori: if - else, switch i goto. Prvi od njih je napisan na sljedeći način:

if (provjera_uvjeta) izjava_1; else operator_2;

Ako je uvjet u zagradama istinit, izvršava se izjava_1, ako je lažan, izvršava se izjava_2. Ako je potrebno izvršiti nekoliko naredbi umjesto jedne, one se stavljaju u vitičaste zagrade. Naredba if ne smije sadržavati riječ else.

U naredbi if - else, ključne riječi if i else moraju odmah slijediti druge naredbe. Ako je barem jedna od njih if naredba, naziva se ugniježđena. Prema SI(C) konvenciji, riječ else uvijek se odnosi na najbliži prethodni if.

Naredba switch omogućuje vam odabir jedne od nekoliko alternativa. Napisan je u sljedećem formalnom obliku:

prekidač (izraz)

case konstanta_1: izjave_1;

case konstanta_2: izjave_2;

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

zadano: operators_default;

Ovdje se procjenjuje vrijednost cijelog izraza u zagradama (koji se ponekad naziva selektor) i uspoređuje sa svim konstantama (konstantnim izrazima). Sve konstante moraju biti različite. Ako postoji podudaranje, izvršit će se odgovarajuća verzija operatora (jedan ili više operatora). Opcija s ključnom riječi default implementirana je ako nijedna od ostalih nije prikladna (riječ default može nedostajati). Ako nema zadane vrijednosti i svi rezultati usporedbe su negativni, tada se nijedna opcija ne izvršava.

Za zaustavljanje naknadnih provjera nakon što je određena opcija uspješno odabrana, koristi se naredba break kako bi se osigurao trenutni izlaz iz prekidača.

Dopuštene su ugniježđene konstrukcije prekidača.

Razmotrimo pravila za izvođenje bezuvjetnog prijelaza, koja se mogu predstaviti u sljedećem obliku:

goto oznaka;

Oznaka je bilo koji identifikator iza kojeg slijedi dvotočka. Naredba goto označava da se izvođenje programa mora nastaviti počevši od naredbe ispred koje stoji oznaka. Oznaka se može postaviti prije bilo koje naredbe u funkciji gdje se nalazi odgovarajuća naredba goto. Ne treba to najavljivati.

Turbo Debugger u potpunosti podržava sintaksu izraza SI (C) jezika. Izraz se sastoji od mješavine operacija, nizova, varijabli

Sintaksa operatora dodjele SI jezika je:
LVvrijednost = RVvrijednost;
LValue je mjesto gdje će vrijednost biti zapisana. Samo varijabla može djelovati kao takav objekt u SI.
RValue je vrijednost koju ćemo pisati u LValue. A tu ulogu mogu igrati takvi objekti kao što su:
varijabla,
konstantno,
operater poziva funkcije,
matematički ili logički izraz.
Primjeri zadataka
int a, b, c;
dvostruki x, y;
a = 5; b = 4; c = a + b;
x = 5,0; y = exp(x);

Poboljšani operatori dodjele u SI

SI sadrži takozvane poboljšane operatore dodjele, oni izgledaju ovako:
LVvrijednost X= RVvrijednost; gdje je X jedna operacija iz skupa: + - * / % ^ & | >. ovo je analogno operatoru dodjele:
LVvrijednost = LVvrijednost X RVvrijednost;
npr.:
a += b; ≡ a = a + b;
U SI jeziku sve matematičke operacije mogu se podijeliti u 2 skupine:
1. matematičke operacije za realne i cjelobrojne izračune;
2. matematičke operacije samo za cjelobrojne izračune.

Matematičke operacije za realne i cjelobrojne izračune u SI jeziku uključuju obične aritmetičke operacije:
zbrajanje (+),
oduzimanje (-),
množenje (*), dijeljenje (/).

Usklađivanje vrste rezultata s vrstama operanda

Značajke SI jezika

Pogledajmo jednu od značajki na primjeru:
int a,b;
dvostruko c;
a = 10;
b = 4;
c = a/b; // c će biti jednako 2, jer operacija nije dijeljenje, već dijeljenje s cijelim brojem, ili:
dvostruko x = 1/3; // x će biti jednak 0, iz istog razloga kao u prethodnom primjeru

Operacije za cjelobrojne izračune

Cjelobrojne operacije uključuju:
operacija uzimanja ostatka dijeljenja,
operacije po bitovima
smjenski rad,
operacije inkrementiranja i dekrementiranja.
Operacija uzimanja ostatka dijeljenja (mod) je binarna operacija i u SI se označava simbolom postotka (%). Primjer izračuna:
int a = 10, b = 3, c;
c = a % b; // c će biti jednako 1

Bitne operacije u SI

Bitne operacije SI jezika predstavljene su s tri binarne i jednom unarnom operacijom. Binarne bitovne operacije uključuju:
I operacija (&),
ILI operacija (|)
operacija "Isključivo ILI" (^).

Evo tablice istinitosti za ove operacije:

prvi operand drugi operand operacija
I ili ekskluzivni ili
0 0 0 0 0
1 0 0 1 1
0 1 0 1 1
1 1 1 1 0

Bitove operacije

Unarna bitovna operacija je operacija negacije, označena simbolom tilde (~). Primjer:
nepredpisani znak a = 10, b; //a: 00001010 = 10
b = ~a; //b: 11110101 = 245

Radnje smjene

Operacije pomaka izvode bitovni pomak vrijednosti cijelog broja navedene u prvom operandu, udesno (simbol >>) ili ulijevo (simbol<<) на указанное во втором операнде целое число бит. Пример:
nepredpisani znak a = 10, b, c; //a: 00001010 = 10
b = a<< 2; //b: 00101000 = 40
c = a >> 1; //c: 00000101 = 5

Operacije inkrementiranja i dekrementiranja

Operacije povećanja (znak ++) i smanjenja (znak -) su unarne i povećavaju odnosno smanjuju cjelobrojnu vrijednost za jedan.
int a = 10, b, c;
b = ++a //predprirast b == 11
c = a++; //post-inkrement s == 11

U modernim programskim jezicima (uključujući SI jezik standarda C99), ove se operacije također mogu koristiti za stvarne vrijednosti. Primjer:
dvostruko x = 12,5;
x++;
printf("%lf\n",x); //izlaz: 13.5

Relacijske operacije (usporedbe)

U programskim jezicima, relacijske operacije (usporedbe) su binarne operacije koje uspoređuju dva operanda i vraćaju rezultat usporedbe kao Booleovu vrijednost. U SI jeziku uobičajeno je interpretirati logičke vrijednosti TRUE i FALSE korištenjem cjelobrojnih vrijednosti:
0 – NETOČNO, 1 – TOČNO.
Ime oznake
> Više
< Manje
>= Više ili jednako
<= Manje ili jednako
== Jednako
!= Nejednak

Primjeri
Neki primjeri korištenja operatora usporedbe:
int a=5, b=4, c=10, x, y;
x = a > b; //x == 1
y = c == a; //y == 0

Logičke operacije u SI

Logičke operacije su unarne ili binarne operacije koje izvode akcije na logičkim vrijednostima i vraćaju logičku vrijednost. Skup logičkih operacija u različitim programskim jezicima može biti različit.

Logičke operacije


Primjeri logičkih operacija:
int a=1, b=0, c, d; //a – TOČNO, b – NETOČNO
c = a || b; //c == 1
d = !b && a; //d == 1

Operativni prioriteti

++, -- Operacije postinkrementiranja i dekrementiranja
() Pozivanje funkcije, grupiranje operacija
Pristup elementu niza
-> Pristup strukturi ili polju unije putem pokazivača
. Pristup strukturi ili union polju
++, -- Operacije predinkrementiranja i dekrementiranja
! Logično "NE"
~ Binarna negacija (inverzija)
+, - Unarni plus i minus
& Operacija preuzimanja adrese
* Dereferencija pokazivača
veličina Operator dimenzioniranja
(tip) Operator pretvorbe tipa
* Množenje
/ Podjela
% Uzimanje ostatka podjele
+ Dodatak
- Oduzimanje
<<, >> Bitovi pomaci lijevo i desno
<, <=, >, >= Operacije usporedbe
==, != Operacije usporedbe
& Bitno "I"
^ Isključivo ILI po bitovima
| Bitno OR
Logički "I"
|| Logički "ILI"
?: Uvjetni rad
= Jednostavan operator dodjele
*=, /=, %=, +=, -=, <<=, >>=, &=, ^=,|= Poboljšani operatori dodjele
, Zarez

Značajke prevoditelja


Redoslijed kojim se argumenti funkcije vrednuju kada se ona poziva nije naveden. Stoga sljedeća izjava može proizvesti različite rezultate kada je prevedu različiti prevoditelji:
printf("%d %lf\n", ++n, pow(2.0,n));
Rezultat će ovisiti o tome hoće li se n povećati prije ili nakon poziva funkcije pow. Da biste riješili problem, samo ga napišite ovako: n++;
printf("%d %lf\n", n,pow(2.0,n));

Shema automatskog lijevanja tipa


1.Ako je neki od operatora tipa duga dvostruka, onda se oboje i drugo reducira na duga dvostruka.
2.Inače, ako je bilo koji od operatora tipa dvostruko, onda se oboje i drugo reducira na dvostruko.
3.Inače, ako je bilo koji od operatora tipa plutati, onda se oboje i drugo reducira na plutati.
4. U suprotnom, proširenje tipa integera izvodi se za oba operanda; onda ako je jedan od operanda tipa unsigned long int, zatim se drugi pretvara u unsigned long int.
5.Inače, ako je jedan od operanda tipa dugo int, i drugi - nepotpisani int, tada rezultat ovisi o tome hoće li dugo int sva značenja nepotpisani int; ako je tako, onda je operand kao nepotpisani int
6.cast to type dugo int; ako ne, tada se oba operanda pretvaraju u unsigned long int.
7.Inače, ako je jedan od operanda tipa dugo int, onda se oboje i drugo reducira na dugo int.
8. Inače, oba operanda su tipa int.

Cast operater

int a = 15, b = 2; dvostruko r = 0,0;
r = a/b; //r == 7.0

Operator pretvaranja tipa: (tipski) izraz.
r = (dvostruko)a / b; //Pravo
r = (dvostruko)(a/b); //Pogrešno

Uvjetni rad


SI jezik ima takozvani uvjetni operator, koji ima sljedeću sintaksu:
stanje? izraz br. 1: izraz br. 2;
Primjer uvjetne operacije. Morate unijeti dvije stvarne vrijednosti s tipkovnice i prikazati najveću od ovih vrijednosti:
#uključi


  {
dvostruko x,y;
scanf("%lf %lf",&x,&y);
dvostruko max = (x > y) ? x:y;
povratak 0;
  }

Morate unijeti tri stvarne vrijednosti s tipkovnice i prikazati najveću od ovih vrijednosti:
#uključi

Int main(int argc, char *argv)
  {
dvostruki x, y, z;
printf("Unesite vrijednosti: ");
scanf("%lf %lf %lf",&x,&y,&z);
dvostruko max = (x > y) ? ((x > z) ? x: z): ((y > z) ? y:z);
printf("Maksimalna vrijednost: %lf\n",max);
povratak 0;
  }

Realni broj se unosi s tipkovnice. Podignite broj na četvrtu potenciju koristeći samo dvije operacije množenja.
#uključi

Int main(int argc, char *argv)
  {
dvostruko a;
printf("Unesite vrijednost: ");
scanf("%lf",&a);
a *= (a *=a);
printf("Rezultat: %lf\n",a);
povratak 0;
  }

Kvadratna jednadžba oblika dana je koeficijentima A, B i C. Odredi koliko korijena ova jednadžba ima.
#uključi

Int main(int argc, char *argv)
  {
dvostruko a,b,c;
printf("Unesite koeficijente A, B i C: ");
scanf("%lf %lf %lf",&a,&b,&c);
dvostruko d = b*b-4*a*c;
int n = (d< 0.0)?0:(d > 0.0)?2:1;
printf("Broj korijena: %d\n",n);
povratak 0;
  }