• A2.5.2. Symbolické konstanty. Řetězcové konstanty

    Vstup výstup

    Funkce výběru:

    %d – celé číslo se znaménkem

    %u – celé číslo bez znaménka

    %f-skutečné číslo

    %c-symbol

    Vstupní vlastnosti:

    24 C datové typy.

    long int counter;

    Aritmetické konstanty.

    nebo v hexadecimální soustavě:

    \a signální volání

    \\ zpětné lomítko

    \b krok zpět (backspace)

    \f konec stránky

    \n nový řádek

    \r návrat vozíku

    \? otazník

    \" jediná citace

    \" dvojitá uvozovka

    \ooo osmičkový kód

    \xhh hexadecimální kód

    Buďte opatrní a pamatujte, že znaková konstanta a řetězec obsahující jeden znak nejsou stejné: "x" není totéž jako "x". Zápis "x" označuje celočíselnou hodnotu rovnající se kódu písmene x ze standardní znakové sady a zápis "x" je pole znaků, které obsahuje jeden znak (písmeno x) a "\0".

    Proměnné a jejich popisy.

    V C musí být jakákoli proměnná deklarována před jejím použitím; obvykle jsou všechny proměnné deklarovány na začátku funkce před první spustitelnou instrukcí. Deklarace popisuje vlastnosti proměnných. Skládá se z názvu typu a seznamu proměnných, například:

    intfahr, celsius;

    int dolní, horní, krok;

    Ve své deklaraci lze proměnnou inicializovat takto:

    char esc = "\\" ;

    Kvalifikátor const lze použít na libovolnou proměnnou v deklaraci, aby naznačil, že se její hodnota nebude dále měnit.

    const double e = 2,71828182845905;

    const char msg = "varování: ";

    Při použití na pole označuje kvalifikátor const, že se žádný z jeho prvků nezmění. Direktivu const lze také použít na argument pole, aby naznačila, že funkce toto pole nemění:

    int strlen(const char);

    Odpověď na pokus o změnu proměnné označené kvalifikátorem const závisí na implementaci kompilátoru.

    Unární operace v C.

    Operátor inkrementace ++ přidá 1 ke svému operandu, zatímco operátor dekrementace odečte 1. Neobvyklá věc na operátorech ++ a -- je, že mohou být použity oba jako prefix (zadáním ++n před proměnnou) a jako postfix (umístěním za proměnnou: n++) operátory. V obou případech se hodnota n zvýší o 1, ale výraz ++n zvýší n před použitím své hodnoty a n++ poté.

    Bitové operace v C.

    C má šest operátorů pro manipulaci s bity. Lze je aplikovat pouze na celočíselné operandy, tedy na operandy typy znaků, short, int a long, sign and unsigned.

    & - bitové AND.

    | - bitový NEBO.

    ^ - bitový XOR.<< - сдвиг влево.

    >> - posun doprava.

    ~ - bitová negace (unární).

    Operátor & (bitový AND) se často používá k nastavení skupiny bitů na nulu. Například,

    n = n & 0177 resetuje všechny číslice v n kromě spodních sedmi.

    Provozovatel | (bitový OR) se používá k nastavení bitů; takže x = x! SET_ON nastaví jedničky v těch bitech x, které odpovídají jedničkám v SET_ON.

    Bitové operátory & a | je třeba odlišit od logické operátory&& a ||, které při vyhodnocení zleva doprava dávají pravdivostní hodnotu. Pokud je například x 1 a y je 2, pak x & y bude nula a x && y bude jedna.

    Operátor ^ (bitový XOR) v každém bitu nastaví 1, pokud mají odpovídající bity operandů různé hodnoty, a 0, pokud se shodují.

    Operátoři<< и >> posun doleva nebo doprava jejich levý operand o počet bitových pozic daných pravým operandem, který musí být nezáporný. Ano, x<< 2 сдвигает значение х влево на 2 позиции, заполняя освобождающиеся биты нулями, что эквивалентно умножению х на 4. Сдвиг вправо беззнаковой величины всегда сопровождается заполнением освобождающихся разрядов нулями. Сдвиг вправо знаковой величины на одних машинах происходит с распространением знака ("арифметический сдвиг"), на других - с заполнением освобождающихся разрядов нулями ("логический сдвиг").

    Unární operátor ~ bitově "obrátí" celé číslo, tj. změní každý jednotlivý bit na nulový bit a naopak. Například x = x & ~077 vynuluje posledních 6 bitů v x.

    Podmíněné operátory v C.

    Podmíněný příkaz if

    Syntax:

    a) krátká forma

    pokud (<выр>) <оператор1>;

    b) plná forma

    pokud (<выр>) <оператор1>;

    jiný<оператор2>;

    Výraz<выр>může být aritmetický, logický nebo vztahový. Pokud je hodnota<выр>se nerovná nule, pak se provede<оператор1>.

    v plném rozsahu pokud<выр>rovná se nule, pak se provede<оператор2>.

    Podmíněný trojitý provoz (?:)

    Syntax:

    <выр1> ? <выр2> : <выр3>;

    Nejprve se vypočítá hodnota<выр1>.

    Pokud se nerovná nule (pravda), pak se hodnota vypočítá<выр2>. Význam<выр3>nevypočteno.

    Pokud je hodnota<выр1>je nula (nepravda), pak se vypočítá hodnota<выр3>. Výpočet hodnoty<выр2>nevyrábí se.

    znak=x<0 ? -1: 1;

    35. Přepnout operátor.

    Přepínače

    Syntax:

    přepínač(<выр>)

    pouzdro<константа_1> : <операторы_1>;

    pouzdro<константа_2> : <операторы_2>;

    pouzdro<константа_L> : <операторы_L>;

    výchozí:<операторы>;

    Při zadání přepínače se hodnota vypočítá<выр>. Pokud se shoduje s některou z konstant, provedou se příkazy uvedené v odpovídající větvi case. Například pokud<выр>==<константа_L>, pak<операторы_L>.

    Pokud je hodnota<выр>neodpovídá žádné z konstant, pak se provedou příkazy zadané po defaultu.

    Pokud mezi příkazy spustitelné větve není žádný příkaz přechodu (break, goto, return, exit()), provedou se příkazy další větve.

    Pokud je mezi příkazy spustitelné větve nalezen příkaz break, pak se řízení přenese na příkaz následující za přepínačem. Pokud je nalezen příkaz goto, pak se řízení přenese na zadaný štítek.

    Výchozí větev může být umístěna kdekoli ve skupině větví přepínače.

    přepínač (operand) (

    případ NÁSOBIT: x *= y; přestávka;

    case DIVIDE: x /= y; přestávka;

    případ ADD: x += y; přestávka;

    případ ODČÍT: x -= y; přestávka;

    case INCREMENT2: x++;

    case INCREMENT1: x++; přestávka;

    case MOD: printf("Neprovedeno\n"); přestávka;

    výchozí: printf("Chyba!\n");

    Je-li operand == NÁSOBIT, provede se x *= y; a zpracování přepínače (a provádění programu) končí.

    Je-li operand == INCREMENT2, provede se x++; x++; a zpracování přepínače je dokončeno.

    Pokud je operand nastaven na EXPONENT, ROOT nebo MOD, provede se printf("Neprovedeno\n");. přestávka;

    36. Smyčkové operátory v C.

    Parametrické pro smyčku

    Syntax:

    pro([<выр1>]; [<выр2>]; [<выр3>]) <оператор>;

    <оператор>opakovat až do<выр2>nebude mít hodnotu 0 ("false").

    PŘED PRVNÍ iterací smyčky se vypočítá hodnota<выр1>. To se obvykle používá k inicializaci čítače smyček. Poté se hodnota vypočítá<выр2>.

    PO KAŽDÉ iteraci se hodnota vypočítá<выр3>. To se obvykle používá ke zvýšení hodnoty čítače smyčky. Poté se hodnota vypočítá<выр2>.

    <выр1>A<выр3>se může skládat z několika výrazů oddělených čárkami.

    Všechny parametry záhlaví smyčky jsou volitelné, ale musí být přítomny oba oddělovače ';'. Tedy formy

    Pro(<выр1>;;) <оператор>;

    Pro(;<выр2>;) <оператор>;

    Pro(;;<выр3>) <оператор>;

    Pro(<выр1>;;<выр3>) <оператор>;

    Pokud chybí<выр2>, pak se jeho hodnota považuje za rovnou 1 ("true").

    Smyčka s podmínkou while

    Syntax:

    zatímco (<выр>) <оператор>;

    <оператор> <выр> <выр>vyhodnoceno PŘED každou iterací.

    Smyčka s postcondition do ... while

    Syntax:

    dělat<оператор>zatímco (<выр>);

    <оператор>je znovu spuštěn, zatímco hodnota<выр>zůstává nenulová. Význam<выр>vypočítané PO každé iteraci.

    Formovací funkce.

    39. Struktura C programu. Variety proměnných.

    void main() /* hlavní program */

    int x, y, z; /* deklarace proměnných typu integer */

    x=5; y=6; /* operátory přiřazení */

    printf("součet=%d\n",z); /* standardní funkce odvození z bibl. */

    Proměnné jsou potřeba tam, kde je potřeba ukládat do paměti počítače jakékoli informace, například mezivýsledky výpočtů apod. Bez nich se neobejde téměř žádný program. Proměnná je oblast paměti RAM s přiřazeným názvem, přes který lze k této oblasti přistupovat. Název může mít až 247 znaků a musí vždy začínat písmenem abecedy nebo podtržítkem, po kterém mohou následovat další písmena, čísla a podtržítka. Na případu postavy záleží.

    Proměnné mohou ukládat různá data a na tom závisí jejich typ. V C++ je poměrně dost různých typů proměnných, dělí se na celočíselné, zlomkové, logické a znakové. Existuje také samostatný typ pro řetězce, ale to je samostatné téma.

    Celočíselné typy zahrnují typy jako int, short (short int) a long. Proměnné typu int zabírají 32 bitů v paměti. Krátké proměnné jsou dvakrát „kratší“, jak název napovídá. V paměti zabírají 16 bitů. Proměnné typu long, respektive dvakrát tak dlouhé, zabírají 64 bitů v paměti.

    Kromě uvedených celočíselných typů existují jejich odrůdy bez znaménka. Jak jste si možná všimli, celočíselné proměnné mohou nabývat kladných i záporných hodnot. Celočíselné proměnné bez znaménka mohou nabývat pouze kladných nebo nulových hodnot. Chcete-li změnit proměnnou bez znaménka, před typ zadejte klíčové slovo unsigned oddělené mezerou.

    Zlomkové typy zahrnují plovoucí a dvojitá - jednoduchá a dvojitá zlomková čísla. Proměnné prvního typu zabírají 32 bitů v paměti, druhý typ - 64.

    Existuje pouze jeden logický typ a nazývá se bool. Jak název napovídá, tento typ je určen k ukládání logických hodnot „true“ (true) nebo „false“ (false).

    Typ postavy je také jediný. Jmenuje se char a může uložit jeden znak, přesněji jeho ASCII číslo, v tomto ohledu se tento typ blíží celočíselným typům. Rozsah hodnot typu char je celá čísla od -128 do 127 (od 0 do 255 pro znak bez znaménka), tedy všechny znaky latinské a národní abecedy, čísla, interpunkční znaménka a speciální znaky, jako např. přechod na další řádek atd. Mějte na paměti, že jednotlivé znaky v C++ jsou uzavřeny v apostrofech.

    Řetězce jako samostatný typ se objevily pouze v C++, v běžném C byly řetězce doslova pole znaků a práce s nimi byla hodně podobná práci s poli.

    aritmetika adresy.

    může být různé:

    výsledek typu int*

    Ukazatele a funkce.

    Ukazatele a dynamické přidělování paměti byly stručně představeny v části 2.2.

    Ukazatel je objekt, který obsahuje adresu jiného objektu a umožňuje vám to nepřímo

    manipulovat s tímto objektem. Obvykle se pro práci používají ukazatele

    dynamicky vytvářené objekty, k budování souvisejících datových struktur, jako jsou např

    jako propojené seznamy a hierarchické stromy a pro přechod do velkých funkcí

    objekty – pole a objekty tříd – jako parametry.

    Každý ukazatel je spojen s nějakým typem dat a jejich interními

    reprezentace nezávisí na vnitřním typu: a velikosti paměti obsazené objektem

    typ ukazatele a mají stejný rozsah hodnot5. Rozdíl je v tom, jak

    kompilátor přijímá adresovaný objekt. Ukazatele na různé typy mohou mít

    stejnou hodnotu, ale oblast paměti, kde se nacházejí odpovídající typy,

    může být různé:

    paměť 1000-1003 (na 32bitovém systému);

    paměť 1000-1007 (na 32bitovém systému).

    Když aplikujeme operaci adresy (&) na objekt typu int, dostaneme

    výsledek typu int*

    Jak vaše programy rostou ve velikosti a složitosti, měli byste je rozdělit na malé spravovatelné části nazývané funkce. Každá funkce ve vašem programu musí provádět určitou úlohu. Pokud například píšete mzdový program, můžete vytvořit jednu funkci, která určuje počet hodin odpracovaných zaměstnancem, druhou funkci, která určuje mzdu přesčas, třetí funkci, která tiskne atd. Pokud program potřebuje provést určitý úkol, zavolá příslušnou funkci a poskytne této funkci informace, které potřebuje během zpracování.

    Formát I/O.

    Dvě funkce: printf pro výstup a scanf pro vstup (další část) umožňují převádět číselné hodnoty

    k symbolické reprezentaci a naopak. Umožňují také generovat a interpretovat formátovací řetězce. Funkce

    printf(kontrola, arg1, arg2, ...)

    převede argumenty do textové podoby podle formátů zadaných v řídicím řetězci a vrátí

    výsledek na standardní výstup. Řídicí řetězec obsahuje dva typy objektů: běžné znaky, které se jednoduše zkopírují

    jsou odeslány do výstupního proudu a specifikace převodu, z nichž každá způsobí převod a tisk dalšího argumentu

    menta printf.

    Každá specifikace převodu začíná znakem "%" a končí znakem převodu (písmeno, definované

    definování typu konverze). Mezi "%" a převodním znakem může být:

    Znaménko mínus, které způsobí, že převedený argument bude zarovnán k levému okraji pole.

    Řetězec čísel, který určuje minimální šířku pole. Převedené číslo bude vytištěno v rámečku alespoň tak širokém a v případě potřeby širší. Pokud má převedený argument méně znaků, než je zadaná šířka pole, bude doplněn vlevo (nebo vpravo, pokud bylo zadáno zarovnání doleva) s výplňovými znaky až do této šířky. Znakem výplně je obvykle mezera, a pokud je šířka pole zadána s úvodní nulou, pak tento znak bude nula (počáteční nula v tomto případě neznamená šířku osmičkového pole).

    Tečka, která odděluje šířku pole od dalšího řetězce čísel.

    Řetězec čísel (přesnost); určuje maximální počet znaků v řetězci, které se mají vytisknout, nebo počet číslic, které se mají vytisknout vpravo od desetinné čárky pro proměnné typu float nebo double.

    Modifikátor délky l, který určuje, že odpovídající datový prvek je typu long spíše než int.

    Vstupní funkce scanf je analogická s printf a umožňuje mnohé obrátit

    ze stejných proměn. Funkce scanf(control, arg1, arg2, ...) čte znaky ze standardního vstupu, interpretuje je podle formátu určeného v argumentu control a umístí výsledky do zbývajících argumentů. Ovládací čára je popsána níže; ostatní argumenty, z nichž každý musí být ukazatel, určují, kam by měl být vhodně převedený vstup umístěn.

    Řídicí řetězec obvykle obsahuje specifikace převodu, které se používají pro přímou interpretaci.

    opakování vstupních sekvencí. Kontrolní řádek může obsahovat:

    Mezery, tabulátory nebo nové řádky ("mezery"), které jsou ignorovány;

    Běžné znaky (nikoli %), o kterých se předpokládá, že odpovídají následujícím znakům vstupního proudu, jiné než „prázdné znaky“;

    Specifikace převodu sestávající ze znaku %, volitelného znaku pro potlačení přiřazení *, volitelného čísla určujícího maximální šířku pole a znaku převodu.

    48. Řetězec je volána posloupnost znaků, která je považována za jeden prvek Řetězec může obsahovat písmena, čísla, různé speciální znaky.V C jsou řetězcové literály nebo konstantní řetězce uzavřeny do uvozovek.

    Řetězec v C je pole znaků, které končí znakem null ('\0'). K řetězci se přistupuje přes ukazatel, který odkazuje na první znak řetězce. Hodnota řetězce je adresa jeho prvního znak.je to ukazatel, ve skutečnosti ukazatel na první znak řetězce Řetězec lze v deklaraci přiřadit buď poli znaků nebo proměnné typu char*.

    struktur.

    V moderních programovacích jazycích existuje speciální datový typ, který může být

    může obsahovat několik prvků jednodušších (navíc jiných!) typů.

    Struktura je datový typ, který může obsahovat několik polí - prvků

    různé typy (včetně jiných struktur).

    Jedním z využití struktur je organizace různých databází, seznamů a podobně.

    Vzhledem k tomu, že struktura je nový datový typ, musí být nejprve deklarována na začátku

    název postavy; // jméno, znakový řetězec

    int rok; // rok vydání, celé číslo

    int stránky; // počet stránek, celé číslo

    K označení celé struktury se používá její název a k označení samostatné

    lyu název tohoto pole je vložen přes tečku. Prvky struktury se zadávají postupně pomocí

    sama. Můžete je vyplnit v libovolném pořadí. S polem struktury můžete pracovat stejným způsobem jako

    a s proměnnou odpovídajícího typu: číselné proměnné se mohou účastnit aritmetiky

    calic výrazy, všechny standardní operace lze provádět s řetězci.

    strcpy(b.autor, "A.S. Pushkin");

    Struktury slouží ke zpracování velkého množství informací, takže nejčastěji in

    Program používá pole struktur. Jsou vyhlašovány stejným způsobem jako obvykle, ale před

    Spíše (vyšší) je potřeba deklarovat samotnou strukturu jako nový datový typ.

    Tečka se také používá k označení pole struktury, ale nyní je nutné zadat ve čtverci

    v závorce je například také číslo požadované struktury

    pro (i = 0; i< 20; i ++) // цикл по всем структурам в массива

    puts(A[i].titul); // zobrazení názvu knihy

    Struktury, stejně jako jakékoli jiné typy, mohou být parametry funkcí a procedur.

    Práce se soubory.

    Soubory jsou textové (do kterých můžete psát pouze písmena, čísla, závorky a

    atd.) a binární (do kterého lze uložit libovolné znaky z tabulky).

    Textové soubory

    (stejné jako u lineárních polí) chyby chybějících nebo nedostatečných dat v souboru.

    Binární soubory

    Je vhodné pracovat s binárním souborem, když jsou data zapsána (nebo budou čtena)

    jiný program a není třeba je prohlížet ručně. Hlavní výhodou této metody je rychlost čtení a zápisu, protože celé pole se čte (nebo zapisuje) najednou v jediném bloku.

    Popis funkcí pro práci se soubory je v knihovně stdio.h

    Nejprve je potřeba vytvořit ukazatel na proměnnou typu FILE (FILE* soubor;).

    Otevření souboru se provede voláním funkce fopen (file = fopen(název_souboru, "w");)

    První parametr této funkce je název souboru, druhý udává, v jakém režimu se má soubor otevřít. "w" - otevřeno pro zápis, "r" - otevřeno pro čtení, "a" - dokončování souboru (toto jsou nejpoužívanější režimy, i když existují i ​​​​jiné). Zápis a čtení dat ze souboru provádějí následující funkce: fputc, fputs, fgetc, fgets, fprintf, fscanf (popis těchto funkcí viz stdio.h).

    Soubor se uzavře voláním funkce fclose(fclose(soubor);).

    Vstup výstup

    Samotný jazyk C neposkytuje žádné I/O schopnosti. Všechny tyto mechanismy na vysoké úrovni musí být poskytovány explicitně nazývanými funkcemi.

    Funkce výběru:

    Int putchar(int c). Výstup jednoho znaku do stdout.

    int fputs(int c,FILE *f).Vypíše jeden znak do souboru f

    Int puts(char *s). Vypíše řetězec s až po ukončovací znak s kódem 0 na standardní výstup. Na konci se vytiskne nový řádek

    Int fputs(char *s,FILE *f). Do souboru f vypíše řetězec s až po koncový znak kódu.

    Int printf() Vytiskne text, jehož formát je popsán, do standardního výstupního proudu.

    Popis formátu začíná symbolem %.

    %d – celé číslo se znaménkem

    %u – celé číslo bez znaménka

    %f - reálné číslo

    %c-symbol

    Vstupní vlastnosti:

    int getchar(void).přečte jeden znak ze stdin

    Int fgetc(FILE *f).Přečte jeden znak ze souboru f

    Char *fgets(char *s,int size,FILE *f)

    int scanf() Čte data ze standardního vstupu podle zadaného formátu.

    24 C datové typy.

    V C existují typy celých čísel různých velikostí, se znaménkem a bez znaménka, čísla s plovoucí desetinnou čárkou, znaky, výčtové typy (enum) a záznamy struktury (struct). Jazyk C navíc nabízí typ sjednocení, pomocí kterého můžete na jedno paměťové místo ukládat heterogenní data, která se nepřekrývají po celou dobu životnosti (tím se šetří paměť), nebo přistupovat k obsahu paměťové oblasti jako k datům různých typů ( což umožňuje změnit typovou interpretaci dat bez změny samotných dat).

    V C existuje několik základních typů:

    char - jeden bajt, může obsahovat jeden znak z platné znakové sady;

    int je celé číslo, obvykle představující přirozenou reprezentaci celých čísel ve stroji;

    float - jedno přesné číslo s plovoucí desetinnou čárkou;

    double - číslo s pohyblivou řádovou čárkou s dvojnásobnou přesností.

    Existuje také několik kvalifikátorů, které lze použít ve spojení se zadanými základními typy. Například kvalifikátory short (short) a long (long) platí pro celá čísla:

    long int counter;

    V takových deklaracích lze slovo int vynechat, což se obvykle dělá.

    Kvalifikátory se znaménkem (se znaménkem) nebo bez znaménka (bez znaménka) lze použít pro typ char a jakýkoli typ celého čísla. Hodnoty bez znaménka jsou vždy kladné nebo nulové a řídí se zákony aritmetického modulu 2n, kde n je počet bitů v reprezentaci typu. Pokud je tedy hodnotě znaku přiřazeno 8 bitů, pak znak bez znaménka má hodnoty v rozsahu od 0 do 255 a znak se znaménkem - od -128 do 127 (v binárním stroji).

    doplňkový kód). Zda jsou hodnoty typu char jednoduše podepsané nebo nepodepsané, závisí na implementaci, ale v obou případech jsou tisknutelné kódy znaků kladné.

    Dlouhý dvojitý typ je určen pro vysoce přesnou aritmetiku s plovoucí desetinnou čárkou. Stejně jako u celých čísel jsou velikosti objektů s pohyblivou řádovou čárkou závislé na implementaci; plovák, dvojitá a dlouhá dvojitá plechovka

    být reprezentován jednou velikostí a může být reprezentován dvěma nebo třemi různými velikostmi.

    Aritmetické konstanty.

    Celočíselná konstanta, například 1234, je typu int. Konstanta dlouhého typu končí l nebo L, jako je 123456789L; celé číslo, které je příliš velké a nemůže být reprezentováno jako int, bude reprezentováno jako long.

    Konstanty bez znaménka končí písmenem u nebo U a koncovka ul nebo UL označuje, že typ konstanty je dlouhý bez znaménka. Konstanty s pohyblivou řádovou čárkou mají desetinnou čárku (123.4) nebo exponenciální část (1e-2) nebo obojí. Pokud nemají koncovku, považují se za typ double. Koncovka f nebo F označuje typ float a 1 nebo L označuje typ long double.

    Celočíselná hodnota může mít kromě desítkové soustavy i osmičkové nebo šestnáctkové zastoupení. Pokud konstanta začíná od nuly, pak je reprezentována v osmičkovém tvaru, pokud od 0x nebo 0X, pak je reprezentována v šestnáctkové soustavě. Například dekadické celé číslo 31 lze zapsat jako 037 nebo jako 0X1F. Položky pro osmičkové a hexadecimální konstanty mohou končit písmenem L (označující dlouhý typ) a U (označující, že konstanta je bez znaménka). Například konstanta 0XFUL má hodnotu 15 a typ je dlouhý bez znaménka.

    Znakové a řetězcové konstanty.

    Znaková konstanta je celé číslo zapsané jako znak obklopený jednoduchými uvozovkami, například "x" . Hodnota znakové konstanty je číselný kód znaku ze znakové sady na daném stroji. Například znaková konstanta ASCII "0" má hodnotu 48, která nemá nic společného s číselnou hodnotou 0. Když napíšeme "0" místo nějaké hodnoty (např. 48), která závisí na metodě kódování, uděláme program nezávislým na konkrétní hodnotě kódu a je také lépe čitelný. Znakové konstanty lze použít v operacích s čísly stejně jako jakákoli jiná celá čísla, i když se běžněji používají pro srovnání s jinými znaky.

    Některé znaky ve znakových a řetězcových konstantách jsou zapsány pomocí escape sekvencí, například \n (znak nového řádku); takové sekvence jsou reprezentovány dvěma symboly, ale označují jeden.

    Kromě toho lze zadat libovolný osmičkový kód ve tvaru "\ooo", kde ooo je jedna, dvě nebo tři osmičkové číslice (0...7) nebo "\xhh", kde hh je jedna, dvě nebo více hexadecimálních číslic číslice (0...9, a...f, A...F). Tak bychom mohli psát

    #define VTAB "013" /* ASCII vertikální karta */

    #define BELL "\007" /* volání do ASCII */

    nebo v hexadecimální soustavě:

    #define VTAB "\xb" /* ASCII vertikální karta */

    #define BELL "\x7" /* volání ASCII */

    Kompletní sada escape sekvencí je následující:

    \a signální volání

    \\ zpětné lomítko

    \b krok zpět (backspace)

    \f konec stránky

    \n nový řádek

    \r návrat vozíku

    \t horizontální tabulátor \v vertikální tabulátor

    \? otazník

    \" jediná citace

    \" dvojitá uvozovka

    \ooo osmičkový kód

    \xhh hexadecimální kód

    Znaková konstanta "\0" je znak s hodnotou null, tzv. null znak. Místo pouhé 0 se ke zdůraznění symbolické povahy výrazu často používá „\0“, ačkoli v obou případech znamená zápis nulu.

    Řetězcová konstanta nebo řetězcový literál je nula nebo více znaků uzavřených do dvojitých uvozovek, jako například "Jsem řetězcová konstanta" nebo "" (prázdný řetězec).

    Uvozovky nejsou součástí řetězce, ale slouží pouze jako jeho oddělovače. Stejně jako u znakových konstant mohou být sekvence escape zahrnuty do řetězců; \" například představuje dvojitou uvozovku. Řetězcové konstanty mohou být zřetězeny ("slepeny") v době kompilace; například zápis dvou řetězců "Ahoj," "svět!" je ekvivalentní zápisu jednoho následujícího řetězce: "Ahoj, svět!".

    Tato vlastnost umožňuje rozdělit dlouhé čáry na části a umístit tyto části na samostatné čáry.

    Řetězcová konstanta je ve skutečnosti pole znaků. Vnitřní reprezentace řetězce má na konci vždy znak null "\0", takže řetězec vyžaduje o jeden bajt paměti více, než je počet znaků mezi dvojitými uvozovkami. To znamená, že délka daného řetězce není nijak omezena, ale pro určení jeho délky je potřeba se podívat na celý řetězec.

    Konstanty

    Konstanty se nazývají neměnné veličiny. Existují celočíselné, reálné, znakové a řetězcové konstanty. Kompilátor, který přidělil konstantu jako token, ji odkazuje na jeden z typů podle jejího vzhledu.

    Formáty konstant odpovídajících každému typu jsou uvedeny v tabulce. 7.1.

    Tabulka 7.1.

    Konstanty v C++

    Konstantní Formát Příklady
    Celý Decimal: Posloupnost desetinných číslic, která nezačíná nulou, pokud to není číslo nula 8, 0, 199226
    Osmičková: nula následovaná osmičkovými číslicemi (0,1,2,3,4,5,6,7) 01, 020, 07155
    Hexadecimální: Ox nebo OX následované hexadecimálními číslicemi (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F) 0xA, 0x1 B8, 0x00FF
    nemovitý Desetinné číslo: [číslice], [číslice] 5.7, .001, 35.
    Exponenciála: [číslice][.][číslice](E|e)[+|-[číslice] 0,2E6, 0,11e-3, 5E10
    Symbolický Jeden nebo dva znaky uzavřené v apostrofech "A", 'u', "*", 'db' '\0' '\n', '\012' "\x07\x07"
    tětiva Posloupnost znaků uzavřená v uvozovkách "Vasia byla tady", "\tHodnota r=\0xF5\"

    Pokud je požadováno vytvoření záporného celého čísla nebo reálné konstanty, pak se před konstantu umístí znaménko unární operace změny znaménka (-), například: -218, -022, -0x3C, -4,8, -0,1 e4.

    Skutečná konstanta v exponenciálním formátu je reprezentována jako mantisa a exponent. Mantisa se píše vlevo od znaménka exponentu (E nebo e), pořadí je vpravo od znaménka. Hodnota konstanty je definována jako součin mantisy a mocniny 10 zvýšené na zadaný řád. Všimněte si, že mezery v čísle nejsou povoleny a k oddělení části celého čísla od čárky se používá tečka, nikoli čárka. zlomková část.

    Typ konstanty si může programátor nastavit sám. Lze vynechat buď celočíselnou část, nebo zlomkovou část, ale ne obojí. Pokud jsou zadány obě části, je vyžadován znak tečky.

    Znakové konstanty, skládající se z jednoho znaku, zabírají jeden bajt v paměti a mají standardní typ char. Dvouznakové konstanty zabírají dva bajty a jsou typu int, přičemž první znak je umístěn v bajtu s nižší adresou.

    Znak zpětného lomítka se používá k reprezentaci:

    kódy, které nemají grafický obrázek (např.
    \a - zvukový signál, \n - přesunutí kurzoru na začátek dalšího řádku);

    apostrof ("), zpětné lomítko (\), otazník (?) a uvozovky (");

    · libovolný znak pomocí jeho hexadecimálního nebo osmičkového kódu, například \073, \0xF5. Číselná hodnota musí být mezi 0 a 255.

    Volají se sekvence znaků, které začínají zpětným lomítkem manažeři, nebo únikové sekvence. Tabulka 7.2. jsou uvedeny jejich přípustné hodnoty. Escape sekvence je interpretována jako jeden znak. Pokud za zpětným lomítkem bezprostředně následuje znak, který není uveden v tabulce 7.2, výsledek interpretace není definován. Pokud je v posloupnosti číslic nalezen neplatný znak, považuje se to za konec číselného kódu.


    Tabulka 7.2.

    Únikové sekvence v C++

    Únikové sekvence lze také použít v řetězcových konstantách nazývaných jinak řetězcové literály. Chcete-li například napsat citaci do řetězce, předchází mu lomítko, kterým jej kompilátor odliší od uvozovky, která ohraničuje řetězec:

    "Nakladatelství \"Petr\""

    Všechny řetězcové literály jsou kompilátorem považovány za odlišné objekty.

    Řetězcové konstanty, oddělené v programu pouze mezerami, se při kompilaci spojí do jedné. Konstantu dlouhého řetězce lze umístit na více řádků pomocí zpětného lomítka následovaného novým řádkem jako pomlčkou. Tyto znaky jsou kompilátorem ignorovány a další řádek je považován za pokračování předchozího. Například čára

    Znaková konstanta je posloupnost jednoho nebo více znaků uzavřených v jednoduchých uvozovkách (např "X"). Pokud je v jednoduchých uvozovkách jeden znak, hodnota konstanty je číselná hodnota tohoto znaku v kódování akceptovaném na daném počítači. Význam víceznakové konstanty je závislý na implementaci.

    Znaková konstanta nemůže obsahovat jedinou uvozovku " nebo znak nového řádku; k jejich zobrazení a některých dalších znaků lze použít únikové sekvence:

    Úniková sekvence \ooo sestává ze zpětného lomítka následovaného jednou, dvěma nebo třemi osmičkovými číslicemi určujícími hodnotu požadovaného znaku. Nejběžnějším příkladem této konstrukce je \0 (nenásleduje číslice); určuje znak NULL. Úniková sekvence \xhh sestává ze zpětného lomítka následovaného písmenem X, následované hexadecimálními číslicemi určujícími hodnotu požadovaného znaku. Počet číslic není omezen, ale výsledek bude nedefinovaný, pokud je hodnota přijatého znaku větší než hodnota „největšího“ povoleného znaku. Pokud v této implementaci typ char považováno za číslo se znaménkem, pak se hodnota v osmičkové i hexadecimální sekvenci escape získá „propagací znaménka“, jako by byla provedena operace přetypování char. Pokud za \ nenásleduje žádný z výše uvedených znaků, výsledek není definován.

    Některé implementace mají rozšířenou znakovou sadu, která nemůže být pokryta typem char. Konstanta pro takovou množinu se píše s písmenem L vpředu (např. L"x") a nazývá se rozšířená znaková konstanta. Taková konstanta je typu wchar_t(celočíselný typ definovaný ve standardním záhlaví souboru ). Stejně jako u normálních znakových konstant jsou i zde možné osmičkové a hexadecimální escape sekvence; pokud zadaná hodnota převyšuje typ wchar_t, výsledek nebude definován.

    Některé z výše uvedených escape sekvencí jsou nové (zejména hexadecimální). Nový je také rozšířený typ pro znaky. Pro písmo jsou vhodné znakové sady běžně používané v Americe a západní Evropě char a typ wchar_t byl přidán hlavně pro asijské jazyky.

    A2.5.3. Konstanty s pohyblivou řádovou čárkou

    Konstanta s plovoucí desetinnou čárkou se skládá z celé části, desetinné čárky, zlomkové části, E nebo E a celé číslo (případně se znaménkem) představující objednávku a případně typovou příponu danou jedním z písmen: F, F, l nebo L. Celé číslo i zlomková část jsou posloupností číslic. Může chybět buď celočíselná část, nebo zlomková část (ale ne obě); může také chybět desetinná čárka popř E s objednávkou (ale ne obojí současně). Typ je definován příponou: F nebo F určit typ plovák, L nebo l- typ dlouhý dvojitý; při absenci přípony je typ implikován dvojnásobek.

    Nové jsou přípony pro konstanty s pohyblivou řádovou čárkou.

    A2.5.4. Výčtové konstanty

    Identifikátory deklarované jako členy výčtu (A8.4) jsou konstanty typu int.

    A2.6. Řetězcové literály

    Řetězcový literál, také známý jako řetězcová konstanta, je posloupnost znaků uzavřená do dvojitých uvozovek (např. "..."). Řetězec má typ "pole znaků" a paměť třídy statický(A4), který je inicializován danými znaky. Zda jsou identické řetězcové literály reprezentovány jednou kopií nebo více kopiemi, závisí na implementaci. Chování programu, který se pokouší upravit řetězcový literál, není definováno.

    Řetězcové literály zapsané do řádků jsou zřetězeny (zřetězeny) do jednoho řetězce. Po jakémkoli zřetězení je k řetězci přidán bajt NULL (\0), který umožňuje programu, který se dívá na řetězec, najít jeho konec. Řetězcové literály nemohou obsahovat nové řádky ani dvojité uvozovky; musí používat stejné sekvence escape jako znakové konstanty.

    Stejně jako u znakových konstant musí řetězcový literál se znaky z rozšířené sady začínat písmenem L(například L"..."). Řetězcový literál z rozšířené sady je typu "array of wchar_t". Vzájemné zřetězení běžných a "rozšířených" řetězcových literálů není definováno.

    Skutečnost, že řetězcové literály nemusí být nutně reprezentovány různými kopiemi, zákaz jejich modifikace, jakož i zřetězení sousedních řetězcových literálů jsou inovacemi standardu ANSI. Poprvé jsou také deklarovány "rozšířené" řetězcové literály.

    A3. Zápis syntaxe

    V zápisu syntaxe použitém v této příručce jsou syntaktické pojmy psány kurzívou a slova a znaky, které jsou brány doslovně, jsou běžným písmem. Alternativní konstrukce jsou obvykle uvedeny ve sloupci (každá alternativa na samostatném řádku); ve vzácných případech jsou dlouhé seznamy malých alternativ na jednom řádku označeném „jedna z“. S indexem je dodáván volitelný slovní termín nebo jiný termín nutné". Takže záznam

    { výraz je vyžadován }

    označuje výraz uzavřený ve složených závorkách, který lze obecně vynechat. Viz A13 pro úplný seznam syntaktických konstrukcí.

    Na rozdíl od gramatiky uvedené v prvním vydání této knihy zde uvedená gramatika explicitně popisuje prioritu a pořadí operací ve výrazech.

    A4. Co znamenají identifikátory?

    Identifikátory nebo názvy odkazují na různé objekty (v originále - věci. - Poznámka. red.): funkce; značky struktur, svazů a výčtů; prvky struktur nebo sdružení; typedef-jména; štítky a předměty. Objekt (někdy nazývaný proměnná) je část paměti, jejíž interpretace závisí na dvou hlavních charakteristikách: paměťová třída n ní typ. Třída úložiště hlásí životnost úložiště spojeného s identifikovaným objektem, typ určuje, jaké hodnoty jsou v objektu. Každý název má svůj vlastní rozsah (tj. část programu, kde je název znám) a atribut odkazu, který určuje, zda název označuje stejný objekt nebo funkci v jiném souboru. Rozsah a atribut odkazu jsou popsány v A11.

    A4.1. Třída paměti

    Existují dvě třídy paměti: auto A statický. Několik klíčových slov v kombinaci s kontextem deklarací objektů určuje třídu úložiště pro tyto objekty.

    Automatické objekty jsou v bloku lokální (A9.3), při jeho opuštění "zmizí". Deklarace zadaná uvnitř bloku, pokud neobsahuje specifikaci třídy úložiště nebo pokud je zadán automatický specifikátor, vytvoří automatický objekt. Objekt označený slovem v deklaraci Registrovat, je automatický a je umístěn do registru stroje, kdykoli je to možné.

    Statické objekty mohou být lokální pro blok nebo umístěny mimo bloky, ale v obou případech jsou jejich hodnoty zachovány po opuštění bloku (nebo funkce), dokud není znovu vložen. Uvnitř bloku (včetně bloku, který tvoří tělo funkce) jsou statické objekty v deklaracích označeny slovem statický. Objekty deklarované mimo všechny bloky na stejné úrovni jako definice funkcí jsou vždy statické. S klíčovým slovem statický mohou být místní v rámci překladové jednotky (v takovém případě obdrží atribut interkom) a stanou se globálními pro celý program, pokud explicitně vynecháte třídu úložiště nebo použijete klíčové slovo externí(v tom případě získají atribut externí komunikace).

    A4.2. Základní typy

    Existuje několik základních typů. Standardní hlavičkový soubor , popsané v příloze B, definuje největší a nejmenší hodnoty pro každý typ v dané konkrétní implementaci. Příloha B uvádí minimální možné hodnoty.

    Velikost objektů deklarovaných jako znaky vám umožňuje uložit jakýkoli znak ze znakové sady akceptované strojem. Pokud jde o objekt typu char ukládá znak z dané množiny, pak jeho hodnotou je kód tohoto znaku, tedy nějaké nezáporné celé číslo. Zadejte proměnné char mohou ukládat i jiné hodnoty, ale pak rozsah jejich hodnot a zejména otázka, zda jsou tyto hodnoty podepsané nebo nepodepsané, závisí na implementaci.

    Nepodepsané znaky deklarované slovy nepodepsaný char, mají stejnou bitovou šířku jako běžné znaky, ale představují nezáporné hodnoty; s pomocí slov podepsaný char můžete explicitně deklarovat podepsané znaky, které zabírají stejné množství místa jako normální znaky.

    Typ nepodepsaný char nebyl zmíněn v prvním vydání jazyka, ale byl používán všemi. Typ podepsaný char- Nový.

    Na rozdíl od char celočíselné typy mohou mít celá čísla tří velikostí: krátký int, int A dlouhá int. Obyčejné objekty typu int mají přirozenou velikost přijatou v architektuře tohoto stroje, jiné velikosti jsou pro speciální potřeby. Delší celá čísla pokrývají alespoň všechny hodnoty kratších celých čísel, nicméně v některých implementacích mohou být běžná celá čísla ekvivalentní krátkým ( krátký) nebo dlouhé ( dlouho) Celý. Všechny typy int představují podepsané hodnoty, pokud není uvedeno jinak.

    Pro celá čísla bez znaménka používá deklarace klíčové slovo nepodepsaný. Taková celá čísla se řídí aritmetikou modulu 2 s mocninou n, Kde n je počet bitů v reprezentaci čísla, a proto v aritmetice celého čísla bez znaménka nikdy nedochází k přetečení. Sada nezáporných hodnot, které lze uložit do podepsaných objektů, je podmnožinou hodnot, které lze uložit do odpovídajících nepodepsaných objektů; reprezentace každé takové hodnoty se znaménkem a bez znaménka jsou stejné. Jakékoli dva typy s plovoucí desetinnou čárkou: jednoduchá přesnost ( plovák), s dvojitou přesností ( dvojnásobek) a se zvýšenou přesností ( dlouhý dvojitý) mohou být synonyma, ale každý následující typ tohoto seznamu musí alespoň zajistit přesnost toho předchozího.

    dlouhý dvojitý- nový typ. V prvním vydání jazyka synonymum pro dvojnásobek byl dlouhý plovák, který byl nyní stažen z oběhu.

    Výčty- jedinečné typy, které mají úplný seznam hodnot; ke každému výčtu je přidružena sada pojmenovaných konstant (A8.4). Výčty se chovají jako celá čísla, ale kompilátor obvykle vydá varovnou zprávu, pokud je objektu nějakého výčtového typu přiřazeno něco jiného než jeho konstanta nebo výraz, který není z výčtu.

    Protože enum objekty lze považovat za čísla, je enum aritmetického typu. Typy char A int jsou volány všechny velikosti, z nichž každá může být podepsána nebo nepodepsána, stejně jako výčty celé číslo (integrální) typy. Typy plovák, dvojnásobek A dlouhý dvojitý nazývané typy s plovoucí bod.

    Typ prázdnota určuje prázdnou sadu hodnot. Používá se jako "návratový typ funkce", když negeneruje žádnou výslednou hodnotu.

    A4.3. Odvozené typy

    Kromě základních typů existuje téměř nekonečná třída odvozených typů, které jsou tvořeny z existujících a popisují následující konstrukce:

    · pole objekty daného typu;

    · funkcí, které vracejí objekty daného typu;

    · ukazatele na objektech daného typu;

    · struktur, obsahující posloupnost objektů, případně různých specifikovaných typů;

    · sdružení, z nichž každý může obsahovat libovolný z několika objektů různých specifikovaných typů.

    V obecném případě lze výše uvedené metody pro konstrukci objektů aplikovat rekurzivně.

    A4.4. Typové kvalifikátory

    Typ objektu lze dodat s kvalifikátorem. Deklarování objektu pomocí kvalifikátoru konst znamená, že jeho hodnota se již nebude dále měnit; prohlásit objekt za nestálý(měnící se, nestálý) Angličtina)), upozorňujeme na jeho speciální vlastnosti pro optimalizaci prováděnou kompilátorem. Žádný z kvalifikátorů neovlivňuje rozsahy hodnot a aritmetické vlastnosti objektů. Kvalifikace jsou popsány v A8.2.

    A5. Objekty a Lhodnoty

    Objekt je nějaká pojmenovaná oblast paměti; lhodnota je výraz označující předmět. Jasný příklad lhodnota je identifikátor s odpovídajícím typem úložiště a třídou. Existují operace, které generují lhodnota. Například pokud E je tedy výraz typu ukazatel *E existuje výraz pro lhodnota, označující předmět, na který ukazuje E. Termín " lhodnota" pochází z přiřazovací notace E1 = E2, ve které levý ( vlevo, odjet- vlevo, odjet ( Angličtina), proto ten dopis l, hodnota- hodnota) operand E1 musí být výraz lhodnota. Popisem každého operátora řekneme, zda očekává lhodnota jako operandy a zda lhodnota jako výsledek.

    A6. Proměny

    Někteří operátoři mohou v závislosti na svých operandech způsobit převod jejich hodnot z jednoho typu na jiný. Tento odstavec vysvětluje, co lze od takových transformací očekávat. A6.5 formuluje pravidla, podle kterých se provádí konverze pro většinu běžných operátorů. Při zvažování každého jednotlivého operátora lze tato pravidla zpřesnit.

    V programuřetězce nebo řetězcové konstanty jsou reprezentovány posloupností obrázků znaků uzavřených v uvozovkách (nikoli v apostrofech), jako například „libovolné znaky“. Mezi znaky řetězce mohou být escape sekvence odpovídající kódům nezobrazených (speciálních) znakových konstant.

    Příklady:

    “1234567890”

    "\t složení prezidia"

    "začátek řádku \t a konec řádku".

    Tak jako ukončovací znak je vybrán znak s kódem 0 (nezaměňujte jej se znakem "0"). Tedy definice

    char HelloStr = "Ahoj světe";

    vlastně interpretováno jako

    char HelloStr = ("H", "e", "l", "l", "o", " ", ",", "w", "o", "r", "l", "d" , "\0");

    K tomu dochází, když je pole inicializováno pomocí řetězce. Ve všech ostatních případech je nalezený řetězec interpretován jako nepojmenované pole příslušné délky, které ještě nebylo vytvořeno. To je výraz

    printf("Ahoj, světe\n");

    vlastně interpretováno jako

    char str1 = "Ahoj světe\n";

    Při umístění řetězce do paměti překladač automaticky přidá na jeho konec znak ‚\0‘, tzn. nulový bajt.

    Počet prvků v takovém poli je o 1 větší než na obrázku odpovídající řetězcové konstanty, protože na konec řetězce byl přidán prázdný bajt '\0'.

    Řetězce mají ještě jednu zvláštnost: překladač přiřadí každému řetězci samostatné místo v paměti počítače i v případech, kdy se několik řetězců zcela shoduje (jazykový standard SI předpokládá, že toto pravidlo nemusí být v konkrétních implementacích splněno).

    Přiřaďte hodnotu poli znaků(tj. řetězec) nelze použít s běžným operátorem přiřazení. Řetězec můžete vložit do pole buď pomocí inicializace (při definování pole znaků) nebo pomocí vstupních funkcí. Ve funkci scanf() nebo printf() pro znakové řetězce se používá specifikace transformace % s.

    Příklad:

    /* vytisknout řetězec znaků */

    #zahrnout

    ( char B="Otevřít sezam!";

    printf("%s",B); ) /*konec programu*/

    Výsledek provádění programu: Sezame, otevři se!

    V programu délka pole V– 17 prvků, tzn. délka řetězce, který má být umístěn do pole (16 znaků), plus nulový bajt na konci řetězce. Při inicializaci pole ve výše uvedeném příkladu je přiděleno 17 bajtů. Inicializace pole znaků s řetězcovou konstantou je zkrácenou verzí inicializace pole a je do jazyka zavedena pro jednoduchost. Můžete použít normální inicializaci tak, že počáteční hodnoty prvků pole umístíte do složených závorek a nezapomenete vložit speciální znak konce řádku '\0' na konec seznamu počátečních hodnot. V programu byla tedy povolena následující inicializace pole B:

    char B = ('C','e','s','a','m',',',' ','o','t','c','p','o' ,'y','s','i','!','\0');

    Jak zadávat řetězce nebo je zobrazovat na obrazovce?

    Řetězec může být zobrazen buď funkcí, kterou již znáte printf() se specifikátorem vstupu "%s", nebo speciální funkce int puts (char *string), která vypíše řetězec tětiva na obrazovku a při úspěchu vrátí nějakou nenulovou hodnotu.

    Proč je specifikátor" %s"? To je provedeno proto, abyste mohli vytisknout řádky s libovolnými znaky. Porovnejte:

    Příklad:

    char str = "Chtěl jsem vytisknout %d...";

    printf("%s", str); /* Správná možnost */

    printf("\n"); /* Nový oddělovač řádků */

    printf(str); /* Špatná volba */

    Zaprvé V tomto případě funkce vytiskne přesně to, co se od ní požaduje. Ale v druhý pouzdro printf(), setkání v řadě str specifikátor "%d" (protože nyní je tento řádek první, takže nastavuje výstupní formát), dojde k závěru, že by za ním mělo následovat číslo. A protože nenásleduje, místo „ %d" vytiskne se nějaký odpad - číslo, které je aktuálně na zásobníku.

    Důsledky mohou být ještě vážnější, pokud řetězec obsahuje sekvenci "%s", bude jej považovat za řetězec a bude jej tisknout, dokud nenarazí na znak null. A kde se s ním setká, kolik času vytisknout a nespadnout, „zda je to kvůli apelu na její památku – nikdo neví.

    Při vytváření řetězců z jednotlivých znaků v programech je třeba dodržet konvenci zakončování řádků. Jako příklad zvažte následující

    /*přečíst řádek z terminálu*/

    int getline(char s, / *vstupní řetězec*/

    int lim) /*jeho maximální délka*/

    ( int c, i; /* c je vstupní znak */

    pro (i=0; i

    s[i] = '\0';

        Vstupně-výstupní linky. Základní funkce řetězců

    Jednou z nejpopulárnějších I/O operací je I/O operace se znakovým řetězcem. Řetězcové I/O funkce zahrnuté v C knihovně pro standardní výměnu I/O dat dostane() A klade(), které je vhodné použít při vytváření dialogových systémů.

    Pro vstupní řetězec existuje funkce s prototypem

    char*gets(char*string),

    který načte řetězec z klávesnice a vloží jej do vyrovnávací paměti tětiva, ukazatel, na který se vrací. Pokud dojde k chybě, vrátí se EOF.

    Funkce má pouze jednu argument - ukazatel s < stdio. h>.

    funkce get(). dokončí svou práci při zadávání znaku ‘\ n, který se po stisknutí klávesy automaticky přenese z klávesnice do počítače . Ovšem samotný symbol ‘\ n se nezapisuje do vstupního řetězce. Místo toho je do řetězce umístěn znak null ‘\0’ . Tím pádem, funkcedostane() vytváří "správný" vstup řetězce, nejen sekvence znaků.

    Zde byste měli věnovat pozornost následující funkci zadávání dat z klávesnice. Funkce dostane() začne zpracovávat informace z klávesnice až po stisknutí klávesy < Vstupte>. Takže „čeká“, dokud není vytočeno nezbytné informace a je stisknuto tlačítko<Vstupte>. Teprve poté začíná zadávání dat do programu.

    Příklad: #zahrnout

    int main(void)(

    printf("Zadejte řetězec:");

    printf("Vstup řetězce byl: %s\n", řetězec);

    Funkce klade() (linkový výstup na obrazovku) při úspěchu vrátí poslední vytištěný znak, což je vždy znak ‘\ n" , pokud došlo k chybě, je vrácena z funkce EOF. Prototyp této funkce vypadá takto:

    int puts(char*s); /*funkce linkového výstupu*/

    Funkce má pouze jednu argument - ukazatel s na řadu znaků. Prototyp funkce je popsán v souboru < stdio. h>.

    Zde je nejjednodušší příklad používání těchto funkcí.

    #zahrnout

    char strl = ”zadejte příjmení zaměstnance:”;

    Připomeňme, že jakýkoli řetězec znaků v jazyce C musí končit znakem null. ‘\0’ . Do posledního prvku pole strl znak null bude zapsán automaticky během překladu, když je pole inicializováno. Pro funkci klade() je vyžadována přítomnost znaku null na konci řetězce.

    Jinak, tzn. pokud v poli znaků není žádný znak‘\0’ , může dojít k selhání programu, protože funkceklade () při hledání nulového znaku bude iterovat veškerou dostupnou paměť bajt po bajtu, počínaje, v našem příkladu, od adresy strl . To je třeba pamatovat, pokud program generuje řetězec, který jej zobrazí na obrazovce.

    Příklad : #zahrnout

    int main(void)(

    char string = "Toto je příklad výstupního řetězce\n";

        Funkce pro manipulaci s řetězci

    Vzhledem k tomu, že v jazyce C neexistuje žádný předdefinovaný typ pro řetězec, neexistují žádné operace tak známé jako porovnávání a lepení řetězců, které jsou implementovány v mnoha jazycích jako operátory sčítání a porovnávání. Zde není povoleno sčítání pole a při porovnávání se nebudou porovnávat samotné řetězce, ale pouze ukazatele na nich, což nás samozřejmě nezajímá.

    Pro manipulaci s řetězci je v souboru deklarována sada funkcí (Ti, kteří píší pod Windows, mohou místo toho obsahovat soubor<okna.h>).

    Nejdůležitější vlastnosti:

      int strcmp(znak*řetězec1, znak*řetězec2)

    provádí srovnání dvou řetězců. se vrací záporné číslo, pokud je první řetězec menší než druhý, 0, pokud jsou řetězce stejné, a kladné číslo, pokud je první řetězec větší než druhý. Podrobněji, funkce vrací rozdíl mezi kódy prvních neidentických znaků, na které narazila (pokud řetězce nemají stejnou délku, pak bude jednou nenulový znak porovnán s nulou).

    Příklad :

    #zahrnout

    #zahrnout

    int main(void)(

    char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc";

    ptr = strcmp(buf2, buf1);

    if (ptr > 0)

    printf("vyrovnávací paměť 2 je větší než vyrovnávací paměť 1 \n");

    printf("vyrovnávací paměť 2 je menší než vyrovnávací paměť 1 \n");

    ptr = strcmp(buf2, buf3);

    printf("vyrovnávací paměť 2 je větší než vyrovnávací paměť 3\n");

    printf("vyrovnávací paměť 2 je menší než vyrovnávací paměť 3\n");

    Na obrazovce se zobrazí:

    buffer 2 je větší než buffer 1

    buffer 2 je menší než buffer 3

      char *strcpy (char *dest, char *zdroj)

    provádí kopírování linky zdroj v místě čáry cíl. Opět se ujistěte, že se celá linka vejde do prostoru pro ni určeného. Funkce vrací ukazatel na cílový řetězec.

    Příklad: #zahrnout

    #zahrnout

    int main(void)(

    char *str1 = "a b c d e f g h i";

    strcpy(řetězec, str1);

    printf("%s\n", řetězec);

    Na obrazovce se zobrazí: a b c d e f g h I

      znak *strcat (znak *řetězec1, znak *řetězec2)

    provádí spojení dvou linií. Druhý řádek se přidá na konec prvního. Funkce nekontroluje (a technicky nemůže zkontrolovat), zda je na konci prvního řádku dostatek paměti – na to byste se měli postarat. Funkce vrací ukazatel na první řetězec.

    Příklad:

    #zahrnout

    #zahrnout

    int main(void) (

    místo určení;

    char *blank = " ", *c = "C++", *turbo = "Turbo";

    strcpy(cíl, turbo); //Zkopírujte řetězec "turbo"

    na místo destinace

    strcat(cíl,prázdný); // Lepení destinace ...

    strcat(cíl, c); // nejprve s prázdný, pak s C

    printf("%s\n", cíl);

    Na obrazovce se zobrazí: Turbo C++

      int strlen(znak*řetězec)

    se vrací délka strunytětiva (bez nulového znaku).

      char *strdup (char *řetězec)

    vytváří duplicitní řádektětiva a vrátí na něj ukazatel. Upozorňujeme, že na rozdíl od jiných funkcí strdup vytváří řetězec sám, a proto jej poté, co jej již nepotřebujete, nezapomeňte uvolnit.

      char *strncpy (char *dest, char *zdroj, počet int)

      char *strncat (znak *řetězec1, znak *řetězec2, počet int)

    rovněž strcpy A strcat, ale zkopírují se pouze první počet postavy. Funkce nepřidávají do řetězce koncovou nulu – budete to muset udělat sami.

      char *strchr (char *string, int c)

      char *strstr (znak *řetězec, char *podřetězec)

    hledat první výskyt do provázku tětiva respektive symbol C a podřetězce podřetězec. Obě funkce vracejí adresu prvního výskytu, popř NULA pokud se žádný nenajde.

    Příklad :

    int main(void)(

    char *ptr, c = "r";

    //Vytvořte řetězec

    strcpy(string, "Toto je řetězec");

    ptr = strchr(řetězec, c);

    printf("Znak %c je na pozici: %d\n", c, ptr-řetězec);

    printf("Postava nebyl nalezeno\n");

    Symbolické konstanty

    Konstanty skutečný typ

    Celočíselné konstanty

    Obecný formát: ± n(+ se obvykle vynechává).

    Desetinné konstanty- posloupnost číslic 0...9, z nichž první by neměla být 0. Například 22 a 273 jsou běžné celočíselné konstanty, pokud potřebujete zadat dlouhou celočíselnou konstantu, pak je uvedeno znaménko L(l) - 273L (273l). Pro takovou konstantu budou přiděleny 4 bajty. Obyčejná celočíselná konstanta, která je pro daný typ příliš dlouhá int, je považován za delší typ ( dlouho nebo dlouhý dlouhý).

    Pro osmičkové a hexadecimální konstanty existuje zápis.

    Osmičkové konstanty- posloupnost číslic od 0 do 7, z nichž první musí být 0, například: 020 = 16 desetinných míst.

    Hexadecimální konstanty- posloupnost čísel od 0 do 9 a písmen od A do F (a...f), začínající znaky 0X (0x), například: 0X1F (0x1f) = 31 desetinných míst.

    Osmičkové a hexadecimální konstanty mohou končit i písmenem L(l) - dlouhé, např. 020L nebo 0X20L.

    Příklady celočíselných konstant:

    1992 13 1000L - desítková;

    0777 00033 01l - osmičková;

    0x123 0X00ff 0xb8000l - hexadecimální.

    Tyto konstanty jsou alokovány v paměti ve dvojitém formátu a ve vnější reprezentaci mohou mít dvě podoby:

    1) s pevnou desetinnou čárkou, formát zápisu: ± n.m, Kde n, m- celá a zlomková část čísla;

    2) plovoucí desetinná čárka (exponenciální tvar): ± n.mp, Kde n, m- celé číslo a zlomkové části čísla, R- objednávka např. 1,25×10 -8 se zapíše jako 1,25E-8.

    Příklady konstant s pevnou a pohyblivou řádovou čárkou:

    1,0 -3,125100e-10 0,12537e+13

    Znaková konstanta je znak uzavřený v jednoduchých uvozovkách: "A", "x" (zabírá 1 bajt).

    V jazyce C se používají a. speciální (kontrola ) znaky nezobrazené na obrazovce; jejich účelem je ovlivnit pořadí, ve kterém se zobrazují ostatní znaky. Protože se nezobrazují na obrazovce, používá se k jejich označení v textu programu dvojice znaků, z nichž první je vždy zpětné lomítko ( obrácené lomítko ) ("\"). Hlavní jsou:

    Zpětné lomítko ve znakových a řetězcových konstantách (viz níže) také představuje některé běžné znaky, jejichž pravopis by mohl vést k nejednoznačnosti:

    Při přiřazení znakové proměnné musí být tyto sekvence uzavřeny v apostrofech. Znaková konstanta "\0" (neplést se znakem - postava"0" !) se často píše místo celočíselné konstanty 0, aby se zdůraznila symbolická povaha nějakého výrazu (viz téma "Řetězce").



    Příklady znakových konstant: "A", "9", "$", "\n", "\"".

    Řetězcová konstanta je posloupnost znaků kódu ASCII uzavřená v uvozovkách (”) . V interní reprezentaci je k řetězcovým konstantám přidán znak null "\0", nazývaný také null terminátor, označující konec řetězce. Uvozovky nejsou součástí řetězce, ale slouží pouze k jeho ohraničení. Řetězec je pole znaků. Interní reprezentace konstanty "01234\0ABCDEF":

    "0","1","2","3","4","\0","A","B","C","D","E","F"," \0"

    Příklady řetězcových konstant:

    "Systém", "\n\t Argument \n", "Stav \"ČEKEJTE\""

    Kompilátor automaticky umístí znak null (null terminátor) na konec řetězcové konstanty. Nulová postava - není to číslo 0, není vytištěn a má kód 0 v tabulce kódů ASCII.

    Například řetězec "" je prázdný řetězec obsahující pouze null terminátor.

    2.8. Pojmenované Konstanty