C++ Változók és típusok: Int, Char, Float, Double, String & Bool
Változók be C++
A C++ változó egy elnevezett tárolási képességet biztosít számunkra. Lehetővé teszi a programozó számára az adatok igény szerinti kezelését. Minden változónak van egy típusa C++. A változótípus segít meghatározni a változó memóriatérképének méretét és elrendezését, a memórián belül tárolható értékek tartományát és a rá alkalmazható műveletek halmazát.
A változók alapvető típusai C++
Itt vannak az alapvető típusok C++ változók:
Int:
Az egész szám egy numerikus literál (számokhoz társítva), tört vagy exponenciális rész nélkül. Példa. 120, -90 stb.
Double:
Ez egy dupla pontosságú lebegőpontos érték. Példa: 11.22, 2.345
Char:
A karakterliterál úgy jön létre, hogy egyetlen karaktert egyetlen idézőjelbe teszünk. Például: „a”, „m”, „F”, „P”, „}” stb.
Úszó:
A lebegőpontos literál olyan numerikus literál, amelynek vagy tört alakja vagy kitevője van. Például: 1.3, 2.6
String betűk:
A string literál kettős idézőjelbe zárt karaktersorozat. Például: "Hogy vagy?"
Bool:
A logikai értéket igaznak vagy hamisnak tartja.
Változók deklarálásának szabályai in C++
Íme néhány általános szabály a változók elnevezésére:
- A C++ A változónév csak ábécét, számot és aláhúzást tartalmazhat.
- A C++ a változó neve nem kezdődhet számmal.
- A változónevek nem kezdődhetnek nagybetűvel.
- Ebben használt változónév C++ nem lehet kulcsszó. Például az int egy kulcsszó, amelyet egész számok jelölésére használnak.
- A C++ A változó neve aláhúzással kezdődhet. Ez azonban nem tekinthető jó gyakorlatnak.
C++ Változó adattípusok
C++ primitív típusok egész halmazát határozza meg
A semmisnek típushoz nincsenek társított értékek, és csak néhány esetben használható. Leggyakrabban olyan függvények visszatérési típusa, amelyek nem adnak vissza értéket.
A aritmetikai típusok karaktereket, egész számokat, logikai értékeket és lebegőpontos számokat tartalmaznak. Aritmetikai típus, ha tovább osztjuk 2 kategóriába
- Lebegőpontos típusok. A float (vagy lebegő típus) decimális számokat jelent. Az IEEE szabvány meghatározza a jelentős számjegyek minimális számát. A legtöbb fordító általában a megadott minimumnál nagyobb pontosságot biztosít. A floatokat általában 32 bites, a duplázókat 64 bites, a hosszú duplákat pedig 96 vagy 128 bites ábrázolják.
- Integrált típusok (amelyek karaktereket, egész számokat és logikai típusokat tartalmaznak). A logikai típusnak csak kétféle értéke van: igaz vagy hamis. Több is van faszén típusok, amelyek többsége a nemzetköziesedés támogatására létezik. A legalapvetőbb karaktertípus a char. A char akkora, mint egy gépi bájt, ami egyetlen bájtot jelent.
A Integrált típusok lehet aláírt vagy aláírás nélküli.
Aláírt típus: Negatív vagy pozitív számokat jelentenek (beleértve a nullát is). Előjeles típusban a tartományt egyenletesen kell felosztani +ve és -ve értékek között. Így egy 8 bites előjeles karakter –127 és 127 közötti értékeket tartalmaz.
Aláíratlan típus: Előjel nélküli típusban minden érték >= 0. Egy 8 bites előjel nélküli karakter 0-tól 255-ig terjedhet (mindkettőt beleértve).
Változó neve vagy azonosítói
Az azonosítók állhatnak néhány betűből, számjegyből és az aláhúzás karakterből vagy ezek kombinációjából. A név hossza nincs korlátozva.
Azonosítókat kell
- betűvel vagy aláhúzással ('_') kezdődik.
- És megkülönböztetik a kis- és nagybetűket; a kis- és nagybetűk különböznek egymástól:
// négy különböző int változót határoz meg
int guru99, gurU99, GuRu99, GURU99;
A C++ a nyelv fenntartott néhány nevet a használatához.
Számos elfogadott konvenció létezik a változók elnevezésére különböző programozási nyelvek. Ezen konvenciók betartása javíthatja a program olvashatóságát.
- Az azonosítónak legalább valamennyire utalnia kell a jelentésére.
- A változónevek általában kisbetűk – guru99, nem Guru99 vagy GURU99.
- Az általunk meghatározott osztályok általában nagybetűvel kezdődnek.
- A több szót tartalmazó azonosítóknak vizuálisan meg kell különböztetniük minden szót. Például guru99_website nem guru99website.
C++ Változó deklaráció és definíció
Egy változó deklarációja a program számára ismertté tesz egy nevet abban a körben, amelyben definiálva van. Példa:
int a=5; int b; char c='A';
int a,b; a=b=1000;
List initialization int a(5); int b{5};
Const selejtező be C++
Tegyük fel, hogy van egy változó buffsize, amely megadja a felhasználótól átveendő bemenetek számát. Itt nem akarjuk megváltoztatni a buffsize értékét az egész programban. Olyan változót szeretnénk definiálni, amelynek értékét tudjuk, hogy nem szabad változnia.
Ilyen esetben használja a const kulcsszót
const int bufSize = 512; // input buffer size
Ez a bufSize-t állandóként határozza meg. A bufSize hozzárendelésére vagy módosítására irányuló minden kísérlet hibát eredményez.
Itt nem tudjuk megváltoztatni a const objektum értékét a létrehozás után, kötelezően deklarálni és inicializálni kell. Ellenkező esetben a fordító hibát jelez.
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
A változók hatóköre C++
A hatókör egy program tartománya, ahol egy változónak van jelentése. Leggyakrabban ugyanaz a név használható különböző entitásokra a különböző hatókörön belül. A változók attól a ponttól láthatók, ahol deklarálják őket, egészen annak a hatókörnek a végéig, amelyben deklarációjuk megjelenik.
#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; }
Ez a program 3 nevet határoz meg: fő, összeg és érték. Az std névtérnevet használja a névtérből származó két másik névvel együtt – a cout és az endl.
- A „main” függvény neve a kapcsos zárójeleken kívül van meghatározva. A fő függvénynév – mint a legtöbb más, a függvényen kívül definiált név – globális hatókörrel rendelkezik. Ami azt jelenti, hogy miután kijelentették, a nevek, amelyek a globális hatókör a program egész ideje alatt elérhetők.
- A változó összeget a fő függvény törzsét képező blokkon belül definiáljuk. Elérhető a deklarációs helyéről és a fő funkció törzsének többi részéből. Rajta kívül azonban nem. Ez azt jelenti, hogy változó összeg van blokk hatóköre.
- A val változó a „for utasítás” hatókörében van definiálva. Könnyen használható ebben az utasításban, de nem máshol a fő függvényben. Megvan helyi hatályú.
Beágyazott hatókör
A hatókör más hatóköröket is tartalmazhat. A foglalt (vagy beágyazott) hatókört belső hatókörnek nevezzük. A tartalmazó hatókör a külső hatókör.
#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; }
1. kimenet az újrafelhasználás helyi meghatározása előtt jelenik meg. Így ez a kimenet
Az utasítás az, amely a globális hatókörben meghatározott újrafelhasznált nevet használja. Ez az állítás kimenet
42 0
2. kimenet az újrafelhasználás helyi meghatározása után következik be. Most a hatálya alá tartozik. Ezért ez a második kimeneti utasítás egyszerűen az újrafelhasznált helyi objektumot használja a globális helyett, és a kimeneteket adja
0 0
3. kimenet segítségével felülbírálja az alapértelmezett hatóköri szabályokat hatókör operátor. A globális hatókörnek nincs neve. Így amikor a hatókör operátor(::) bal oldala üres. A globális hatókör jobb oldalán található név lekérésére irányuló kérésként értelmezi. Így a kifejezés a globális újrafelhasznált és kimeneteket használja
42 0
Változó típusú átalakítás
Az egyik típusú változó egy másikra konvertálható. „Típuskonverzió” néven ismert. Lássuk a különböző konvertálási szabályokat C++ változó típusok:
Nem bool hozzárendelése bool változóhoz hamis értéket ad, ha az érték 0, egyébként igaz.
bool b = 42; // b is true
Egy bool hozzárendelése egy másik aritmetikai típushoz 1-et ad, ha a bool igaz, és 0-t, ha a logika hamis.
bool b = true; int i = b; // i has value 1
Ha egy int típusú változóhoz lebegőpontos értéket rendelünk, akkor az értéke csonkolva lesz. A tárolt érték a tizedesvessző előtti rész.
int i = 3.14; // i has value 3
Egy int érték hozzárendelése egy float típusú változóhoz azt eredményezi, hogy a tört rész nullává válik. A pontosság általában elveszik, ha az egész szám több bitet tartalmaz, mint amennyit a lebegő változó képes befogadni.
Int i=3; double pi = i; // pi has value 3.0
Ha megpróbálunk tartományon kívüli értéket rendelni egy előjel nélküli változóhoz, akkor az eredmény a %(modulo) érték maradéka.
Például egy 8 bites előjel nélküli karaktertípus 0 és 255 közötti értékeket tartalmazhat. Ezen a tartományon kívüli érték hozzárendelése azt eredményezi, hogy a fordító az érték maradékát modulo 256-hoz rendeli. Ezért a fenti logika szerint a –1 hozzárendelése egy 8 bites előjel nélküli karakterhez 255 értéket ad az objektumnak.
unsigned char c = -1; // assuming 8-bit chars, c has value 255
Ha megpróbálunk tartományon kívüli értéket rendelni egy aláírt típusú objektumhoz, az eredmény megjósolhatatlan. Ez meghatározatlan. Úgy tűnhet, hogy a program kívülről működik, vagy összeomolhat, vagy szemét értékeket produkál.
signed char c2 = 256; // assuming 8-bit chars, the value of c2 is undefined
A fordító ugyanezt a típusú konverziót alkalmazza, amikor egy típusú értéket használunk, ahol más típusú értéket várunk.
int i = 42; if (i) // condition will evaluate as true i = 0;
Ha ez az érték = 0, akkor a feltétel hamis; minden más (nem nulla) érték igaz. Ugyanezen elv szerint, ha bool-ot használunk egy aritmetikai kifejezésben, annak értéke mindig 0-ra vagy 1-re lesz konvertálva. Ennek eredményeként a bool használata egy aritmetikai kifejezésben általában szinte biztosan helytelen.
Figyelem: Ne keverje az aláírt és az aláíratlan típusokat
Az előjeles és előjel nélküli kifejezések meglepő és téves eredményeket eredményezhetnek, ha az előjeles érték negatív. A fentebb leírtak szerint az előjeles értékek automatikusan előjel nélküliekké alakulnak.
Például egy számtani kifejezésben, mint pl
x* y
Ha x -1 és y értéke 1, és ha x és y is int, akkor az érték a várakozásoknak megfelelően -1.
Ha x int és y előjel nélküli, akkor ennek a kifejezésnek az értéke attól függ, hogy egy egész szám hány bitje van a fordítógépen. A mi gépünkön ez a kifejezés 4294967295-öt eredményez.
Változók regisztrálása
A regiszterváltozók gyorsabban érhetők el, mint a memóriaváltozók. Tehát olyan változók, amelyeket gyakran használnak a C++ segítségével a program regiszterekbe helyezhető Regisztráció kulcsszó. A regiszter kulcsszó azt mondja a fordítónak, hogy az adott változót egy regiszterben tárolja. A fordító döntése, hogy beírja-e a regiszterbe vagy sem. Általában maguk a fordítók végeznek különféle optimalizálásokat, amelyek magukban foglalják a változók regiszterbe vételét. A regiszterváltozók száma nincs korlátozva a C++ program. De a fordító nem tárolja a változót egy regiszterben. Ennek az az oka, hogy a regisztermemória nagyon korlátozott, és általában az operációs rendszer használja.
Meghatározni:
register int i;
Hozzászólások
A megjegyzések a kód azon részei, amelyeket a fordító figyelmen kívül hagy. Lehetővé teszi a programozó számára, hogy feljegyzéseket készítsen a forráskód/program megfelelő területein. A megjegyzések blokk formában vagy egysoros formában érkeznek. A program megjegyzései magyarázó nyilatkozatok. Belekerülhet a C++ kódot, amely segít bárkinek elolvasni a forráskódját. Minden programozási nyelv lehetővé teszi valamilyen megjegyzést. C++ támogatja az egysoros és többsoros megjegyzéseket is.
- Egysoros megjegyzések azok, amelyek // karakterrel kezdődnek és a sor végéig folytatódnak. Ha a megjegyzéssorban az utolsó karakter egy \, akkor a megjegyzés a következő sorban folytatódik.
- Többsoros megjegyzések azok, amelyek /*-al kezdődnek és */-re végződnek.
/* This is a comment */ /* C++ comments can also * span multiple lines */
Menekülési szekvenciák
Egyes karaktereknek, például a backspace-nek és a vezérlőkaraktereknek nincs látható képe. Az ilyen karaktereket nem nyomtatható karaktereknek nevezzük. Más karakterek (egy- és dupla idézőjelek, kérdőjelek és fordított perjel) különleges jelentéssel bírnak a sok programozási nyelvben.
Programjaink nem tudják közvetlenül ezeket a karaktereket használni. Ehelyett egy escape szekvenciát használhatunk az ilyen karakterek ábrázolására. A escape szekvencia fordított perjellel kezdődik.
A C++ programozási nyelv több menekülési szekvenciát határoz meg:
Mit tegyek? | Karakter |
---|---|
Új sor | \n |
Függőleges fül | \v |
backslash | \\ |
Szállítás vissza | \r |
Vízszintes fül | \t |
Backspace | \b |
Kérdőjel | \? |
Formfeed | \f |
Figyelmeztetés (csengő) | \a |
Double idézet | \ ” |
Egyetlen idézet | \ ' |
Escape sorozatot használunk, mintha egyetlen karakter lenne:
cout << '\n'; // prints a newline cout << "\tguru99!\n"; // prints a tab followed by "guru99!" and a newline
Írhatunk általánosított escape szekvenciákat is \x, amelyeket egy vagy több hexadecimális számjegy követ. Vagy használunk egy \-t, amelyet egy, két vagy három oktális számjegy követ. Az általánosított escape szekvencia a karakter numerikus értékét jelenti. Néhány példa (a Latin-1 karakterkészletet feltételezve):
\7 (bell) \12 (newline) \40 (blank) \0 (null) \115 ('M') \x4d ('M')
Használhatunk előre meghatározott escape szekvenciákat, mint bármely más karaktert.
cout << "Hi \x4dO\115!\n"; // prints Hi MOM! followed by a newline cout << '\115' << '\n'; // prints M followed by a newline
Összegzésként
- A C++ változó egy elnevezett tárolási képességet biztosít számunkra.
- C++ változó típusok: int, double, faszén, float, string, bool stb.
- A beágyazott (vagy beágyazott) hatókört belső hatókörnek nevezzük, a tartalmazó hatókört pedig a külső hatókörnek.
- Az egyik típusú változó egy másikra konvertálható. „Típuskonverzióként” ismert.
- A regiszterváltozók gyorsabban érhetők el, mint a memóriaváltozók.
- A megjegyzések a kód azon részei, amelyeket a fordító figyelmen kívül hagy.
- Egyes karaktereknek, például a backspace-nek és a vezérlőkaraktereknek nincs látható képe.