C++ Proměnné a typy: Int, Char, Float, Double, String & Bool
Proměnné v C++
A C++ proměnná nám poskytuje pojmenovanou kapacitu úložiště. Umožňuje programátorovi manipulovat s daty podle potřeby. Každá proměnná má svůj typ C++. Typ proměnné pomáhá určit velikost a rozložení mapy paměti proměnné, rozsah hodnot, které lze v této paměti uložit, a sadu operací, které na ni lze použít.
Základní typy proměnných v C++
Zde jsou základní typy C++ proměnné:
Int:
Celé číslo je číselný literál (spojený s čísly) bez jakékoli zlomkové nebo exponenciální části. Příklad. 120, -90 atd.
Double:
Jedná se o hodnotu s pohyblivou řádovou čárkou s dvojnásobnou přesností. Příklad: 11.22, 2.345
Char:
Znakový literál je vytvořen uzavřením jediného znaku do jednoduchých uvozovek. Například: 'a', 'm', 'F', 'P', '}' atd.
Plovák:
Literál s plovoucí desetinnou čárkou je číselný literál, který má buď formu zlomku, nebo formu exponentu. Například: 1.3, 2.6
Smyčcové literály:
Řetězcový literál je posloupnost znaků uzavřená do dvojitých uvozovek. Například: "Jak se máš?"
Bool:
Má logickou hodnotu true nebo false.
Pravidla deklarování proměnných v C++
Zde jsou některá běžná pravidla pro pojmenování proměnné:
- A C++ název proměnné může mít pouze abecedy, čísla a podtržítko.
- A C++ název proměnné nemůže začínat číslem.
- Názvy proměnných by neměly začínat velkým písmenem.
- Název proměnné použitý v C++ nemůže být klíčovým slovem. Například int je klíčové slovo, které se používá k označení celých čísel.
- A C++ název proměnné může začínat podtržítkem. Nepovažuje se to však za dobrou praxi.
C++ Variabilní datové typy
C++ definuje celou sadu primitivních typů
Jedno zrušit typ nemá žádné přidružené hodnoty a lze jej použít pouze v několika případech. Nejčastěji se jedná o návratový typ funkcí, které nevrací hodnotu.
Jedno aritmetické typy zahrnují znaky, celá čísla, booleovské hodnoty a čísla s plovoucí desetinnou čárkou. Aritmetický typ, pokud je dále rozdělen do 2 kategorií
- Typy s plovoucí desetinnou čárkou. Float (neboli plovoucí typ) představují desetinná čísla. Norma IEEE specifikuje minimální počet platných číslic. Většina kompilátorů obvykle poskytuje větší přesnost, než je zadané minimum. Typicky jsou floats reprezentovány v 32 bitech, double v 64 bitech a long double v 96 nebo 128 bitech.
- Integrální typy (které zahrnují znaky, celá čísla a booleovské typy). The Boolean typ má pouze dva typy hodnot: True nebo False. Je jich několik spálit typů, z nichž většina existuje na podporu internacionalizace. Nejzákladnějším typem postavy je char. Znak má stejnou velikost jako jeden strojový bajt, což znamená jeden bajt.
Jedno Integrální typy mohou být podepsané nebo nepodepsané.
Podepsaný typ: Představují záporná nebo kladná čísla (včetně nuly). V podepsaném typu musí být rozsah rovnoměrně rozdělen mezi hodnoty +ve a -ve. 8bitový znak se znaménkem tedy bude obsahovat hodnoty od –127 do 127.
Nepodepsaný typ: V typu bez znaménka jsou všechny hodnoty >= 0. 8bitový znak bez znaménka může obsahovat 0 až 255 (obojí včetně).
Název proměnné nebo identifikátory
Identifikátory se mohou skládat z několika písmen, číslic a znaku podtržítka nebo z nějaké jejich kombinace. Délka jména není omezena.
Identifikátory musí
- začínají buď písmenem, nebo podtržítkem ('_').
- A rozlišují velká a malá písmena; velká a malá písmena se liší:
// definuje čtyři různé proměnné int
int guru99, gurU99, GuRu99, GURU99;
Jedno C++ jazyk si pro své použití vyhradil některá jména.
Existuje mnoho přijatých konvencí pro pojmenování proměnných v různé programovací jazyky. Dodržování těchto konvencí může zlepšit čitelnost programu.
- Identifikátor by měl alespoň nějakým způsobem naznačovat jeho význam.
- Názvy proměnných jsou obvykle malá – guru99, nikoli Guru99 nebo GURU99.
- Třídy, které definujeme, obvykle začínají velkým písmenem.
- Identifikátory, které obsahují více slov, by měly vizuálně rozlišovat každé slovo. Například guru99_website není guru99website.
C++ Deklarace a definice proměnné
Deklarace proměnné učiní jméno programu známé v rozsahu, ve kterém je definována. Příklad:
int a=5; int b; char c='A';
int a,b; a=b=1000;
List initialization int a(5); int b{5};
Konstantní kvalifikace v C++
Předpokládejme, že existuje proměnná buffsize, která udává počet vstupů, které mají být převzaty od uživatele. Zde nechceme měnit hodnotu buffsize v průběhu programu. Chceme definovat proměnnou, jejíž hodnota by se neměla měnit.
V takovém případě použijte klíčové slovo const
const int bufSize = 512; // input buffer size
To definuje bufSize jako konstantu. Jakýkoli pokus o přiřazení nebo změnu bufSize způsobí chybu.
Zde nemůžeme změnit hodnotu objektu const poté, co jej vytvoříme, musí být povinně deklarován a inicializován. Jinak kompilátor vyvolá chybu.
const int i = get_size(); // ok: initialized at run time const int j = 42; // ok: initialized at compile time const int k; // error: k is uninitialized const int i = 42; const int ci = i; // ok: the value in i is copied into ci
Rozsah proměnných v C++
Rozsah je rozsah programu, kde má proměnná význam. Většinou lze stejný název použít k označení různých entit v různých oblastech. Proměnné jsou viditelné od místa, kde jsou deklarovány, až do konce rozsahu, ve kterém se jejich deklarace objevuje.
#include <iostream> int main() { int sum = 0; // sum values from 1 through 10 inclusive for (int val = 1; val <= 10; ++val) sum += val; // equivalent to sum = sum + val cout << "Sum of 1 to 10 inclusive is "<< sum <<endl; return 0; }
Tento program definuje 3 názvy, viz, main, sum a val. Používá název jmenného prostoru std spolu s dalšími dvěma názvy z tohoto jmenného prostoru – cout a endl.
- Název funkce „main“ je definován mimo složené závorky. Název funkce main – stejně jako většina ostatních názvů definovaných mimo funkci – má globální rozsah. Což znamená, že jednou deklarovaná jména, která jsou na globální působnost jsou přístupné po celou dobu programu.
- Proměnná suma je definována v rámci bloku, který je tělem hlavní funkce. Lze k němu přistupovat z jeho deklaračního bodu a ze zbytku těla hlavní funkce. Ne však mimo něj. To znamená, že proměnná suma má blokový rozsah.
- Proměnná val je definována v rozsahu „for statement“. Může být snadno použit v tomto příkazu, ale ne jinde v hlavní funkci. Má to místní působnost.
Vnořený rozsah
Rozsah může obsahovat další rozsahy. Obsažený (nebo vnořený) obor se označuje jako vnitřní obor. Obsahující rozsah je vnější rozsah.
#include <iostream> using namespace std; // Program for illustration purposes only: It is bad style for a function // to use a global variable and also define a local variable with the same name int reused = 42; // reused has global scope int main() { int unique = 0; // unique has block scope // output #1: uses global reused; prints 42 0 cout << reused << " " << unique << endl; int reused = 0; // new, local object named reused hides global reused // output #2: uses local reused; prints 0 0 cout << reused << " " << unique << endl; // output #3: explicitly requests the global reused; prints 42 0 cout << ::reused << " " << unique << endl; return 0; }
Výstup #1 se objeví před místní definicí opětovného použití. Tedy tento výstup
příkaz je ten, který používá znovu použitý název, který je definován v globálním rozsahu. Výstupem tohoto prohlášení
42 0
Výstup #2 dochází po místní definici znovupoužití. Nyní je v rozsahu. Proto tento druhý výstupní příkaz jednoduše používá lokální objekt s názvem reused, nikoli globální a výstupy
0 0
Výstup #3 přepíše výchozí pravidla oboru pomocí operátor rozsahu. Globální rozsah nemá žádné jméno. Tedy, když má operátor rozsahu(::) prázdnou levou stranu. Interpretuje to jako požadavek na načtení názvu na pravé straně globálního rozsahu. Výraz tedy používá globální znovupoužité a výstupy
42 0
Konverze typu proměnné
Proměnnou jednoho typu lze převést na jiný. Je známá jako „převod typu“. Podívejme se na různá pravidla pro převod C++ typy proměnných:
Přiřazení non-bool proměnné bool dává hodnotu false, pokud je hodnota 0 a v opačném případě true.
bool b = 42; // b is true
Přiřazení bool k jednomu z dalších aritmetických typů dává 1, pokud je bool pravdivý, a 0, pokud je bool nepravdivý.
bool b = true; int i = b; // i has value 1
Přiřazení hodnoty s plovoucí desetinnou čárkou proměnné typu int poskytne hodnotu, která je zkrácena. Uložená hodnota je část před desetinnou čárkou.
int i = 3.14; // i has value 3
Přiřazení hodnoty int proměnné typu float má za následek, že se zlomková část stane nulou. Přesnost se obvykle ztratí, pokud má celé číslo více bitů, než kolik dokáže pojmout plovoucí proměnná.
Int i=3; double pi = i; // pi has value 3.0
Pokud se pokusíme přiřadit proměnnou typu bez znaménka hodnotu mimo rozsah, výsledkem je zbytek hodnoty %(modulo)
Například 8bitový typ znaku bez znaménka může obsahovat hodnoty od 0 do 255 včetně. Přiřazení hodnoty mimo tento rozsah povede k tomu, že kompilátor přiřadí zbytek této hodnoty modulo 256. Proto podle výše uvedené logiky přiřazení –1 k 8bitovému znaku bez znaménka dává tomuto objektu hodnotu 255.
unsigned char c = -1; // assuming 8-bit chars, c has value 255
Pokusíme-li se objektu podepsaného typu přiřadit hodnotu mimo rozsah, výsledek je nepředvídatelný. Není definováno. Navenek se může zdát, že program funguje, může selhat nebo může vytvářet nesmyslné hodnoty.
signed char c2 = 256; // assuming 8-bit chars, the value of c2 is undefined
Kompilátor použije stejný typ konverzí, když použijeme hodnotu jednoho typu, kde se očekává hodnota jiného typu.
int i = 42; if (i) // condition will evaluate as true i = 0;
Pokud je tato hodnota = 0, pak je podmínka nepravdivá; všechny ostatní (nenulové) hodnoty dávají hodnotu true. Podle stejného konceptu, když použijeme bool v aritmetickém výrazu, jeho hodnota se vždy převede buď na 0, nebo na 1. V důsledku toho je použití bool v aritmetickém výrazu obvykle téměř jistě nesprávné.
Upozornění: Nemíchejte podepsané a nepodepsané typy
Výrazy, které kombinují se znaménkem a bez znaménka, mohou přinést překvapivé a nesprávné výsledky, pokud je hodnota se znaménkem záporná. Jak bylo uvedeno výše, hodnoty se znaménkem se automaticky převedou na nepodepsané.
Například v aritmetickém výrazu jako
x* y
Pokud x je -1 a y je 1, a pokud jsou x i y int, pak je podle očekávání hodnota -1.
Pokud x je int a y jsou bez znaménka, pak hodnota tohoto výrazu závisí na tom, kolik bitů má celé číslo na kompilačním stroji. Na našem počítači tento výraz dává 4294967295.
Registrovat proměnné
Proměnné registrů jsou ve srovnání s paměťovými proměnnými rychlejší. Takže proměnné, které se často používají v a C++ program lze vložit do registrů pomocí registrovat se klíčové slovo. Klíčové slovo register říká kompilátoru, aby uložil danou proměnnou do registru. Je na rozhodnutí kompilátoru, zda jej vloží do registru nebo ne. Obecně kompilátory samy provádějí různé optimalizace, které zahrnují vkládání některých proměnných do registru. Počet proměnných registru v a není omezen C++ naprogramovat. Kompilátor však nemusí uložit proměnnou do registru. Je to proto, že paměť registrů je velmi omezená a nejčastěji ji používá operační systém.
Definovat:
register int i;
Komentáře
Komentáře jsou části kódu, které kompilátor ignoruje. Umožňuje programátorovi dělat si poznámky v příslušných oblastech zdrojového kódu/programu. Komentáře přicházejí buď v blokové formě, nebo na jednotlivých řádcích. Komentáře k programu jsou vysvětlující prohlášení. Lze jej zařadit do C++ kód, který pomáhá komukoli číst jeho zdrojový kód. Všechny programovací jazyky umožňují určitou formu komentářů. C++ podporuje jednořádkové i víceřádkové komentáře.
- Jednořádkové komentáře jsou ty, které začínají // a pokračují až do konce řádku. Pokud je poslední znak v řádku komentáře \, bude komentář pokračovat na dalším řádku.
- Víceřádkové komentáře jsou ty, které začínají /* a končí */.
/* This is a comment */ /* C++ comments can also * span multiple lines */
Únikové sekvence
Některé znaky, například backspace a řídicí znaky, nemají žádný viditelný obrázek. Takové znaky jsou známé jako netisknutelné znaky. Ostatní znaky (jednoduché a dvojité uvozovky, otazník a zpětné lomítko) mají v mnoha programovacích jazycích zvláštní význam.
Naše programy nejsou schopny žádný z těchto znaků přímo používat. Místo toho můžeme k reprezentaci takového znaku použít escape sekvenci. Escape sekvence začíná zpětným lomítkem.
Jedno C++ programovací jazyk definuje několik escape sekvencí:
Co to dělá? | Znak |
---|---|
Nový řádek | \n |
Vertikální záložka | \v |
Zpětné lomítko | \\ |
Návrat vozu | \r |
Vodorovná karta | \t |
Backspace | \b |
Otazník | \? |
Formfeed | \f |
Upozornění (zvonek) | \a |
Double citovat | \” |
Jediný citát | \ ' |
Použijeme escape sekvenci, jako by to byl jeden znak:
cout << '\n'; // prints a newline cout << "\tguru99!\n"; // prints a tab followed by "guru99!" and a newline
Můžeme také napsat zobecněné escape sekvence \x následované jednou nebo více hexadecimálními číslicemi. Nebo použijeme \ následované jednou, dvěma nebo třemi osmičkovými číslicemi. Zobecněná sekvence escape představuje číselnou hodnotu znaku. Některé příklady (za předpokladu, že znaková sada Latin-1):
\7 (bell) \12 (newline) \40 (blank) \0 (null) \115 ('M') \x4d ('M')
Můžeme použít předdefinované sekvence escape, stejně jako používáme jakýkoli jiný znak.
cout << "Hi \x4dO\115!\n"; // prints Hi MOM! followed by a newline cout << '\115' << '\n'; // prints M followed by a newline
Shrnutí
- A C++ proměnná nám poskytuje pojmenovanou kapacitu úložiště.
- C++ typy proměnných: int, double, spálit, float, string, bool atd.
- Obsažený (nebo vnořený) rozsah se označuje jako vnitřní rozsah a obsahující rozsah je vnější rozsah.
- Proměnnou jednoho typu lze převést na jiný. Je známá jako „převod typu“.
- Proměnné registrů jsou ve srovnání s paměťovými proměnnými rychlejší.
- Komentáře jsou části kódu, které kompilátor ignoruje.
- Některé znaky, například backspace a řídicí znaky, nemají žádný viditelný obrázek.