Mi a tipizálás C-ben?
A típusváltás egy adattípust konvertál egy másikra. Adatkonverziónak vagy típuskonverziónak is nevezik. Ez az egyik fontos fogalom, amelyet a „C” programozás vezet be.
A „C” programozás kétféle típusú öntési műveletet kínál:
- Implicit típusú casting
- Explicit típusú casting
Implicit típusú casting
Az implicit típustovábbítás az adattípusok átalakítását jelenti eredeti értelmének elvesztése nélkül. Ez a típusú tipizálás elengedhetetlen, ha az adattípusokat úgy kívánja megváltoztatni, hogy a változóban tárolt értékek jelentősége nem változik.
Az implicit típuskonvertálás automatikusan megtörténik, amikor az értéket átmásolják a kompatibilis adattípusba. Az átalakítás során szigorú szabályokat alkalmaznak a típusátalakításra. Ha az operandusok két különböző adattípusból állnak, akkor az alacsonyabb adattípusú operandus automatikusan magasabb adattípussá alakul. Ez a típusú átalakítás a következő példában látható.
#includeint main(){short a=10; //initializing variable of short data typeint b; //declaring int variableb=a; //implicit type castingprintf("%d\n",a);printf("%d\n",b);}
Kimenet
1010
- Az adott példában rövid adattípusú változót deklaráltunk, amelynek értéke inicializálva 10 volt.
- A második sorban deklaráltunk egy int adattípusú változót.
- A harmadik sorban az s változó értékét rendeltük az a változóhoz. A harmadik vonalon implicit típusú konverziót hajtunk végre, amikor az s változóból származó, rövid adattípusú érték átmásolódik az a változóba, amely int adattípusú.
Karakter konvertálása Int
Tekintsük az ASCII-ben dekódolt karakter egész számmal való hozzáadásának példáját:
#includemain() {int number = 1;char character = 'k'; /*ASCII value is 107 */int sum;sum = number + character;printf("Value of sum : %d\n", sum );}
Kimenet:
Value of sum : 108
Itt a fordító egész szám promóciót hajtott végre azzal, hogy a tényleges összeadási művelet végrehajtása előtt a „k” értékét ASCII-vé konvertálta.
Számtani konverziós hierarchia
A fordító először egy karaktert egész számgá emeli. Ha az operandusoknak még mindig különböző adattípusaik vannak, akkor azokat a legmagasabb adattípussá konvertálják, amely a következő hierarchiadiagramon jelenik meg:
Vegye figyelembe a következő példát a koncepció megértéséhez:
#includemain() {int num = 13;char c = 'k'; /* ASCII value is 107 */float sum;sum = num + c;printf("sum = %f\n", sum );}
Kimenet:
sum = 120.000000
Először is, a c változó egész számra konvertálódik, de a fordító a számokat és a c értékeket "lebegővé" alakítja, és összeadja őket egy "lebegő" eredmény létrehozásához.
Fontos pontok az implicit konverziókkal kapcsolatban
- A típusátalakítás implicit típusát szokásos típusú konverziónak is nevezzük. Az implicit típusú castingban nem igényelünk kulcsszavakat vagy speciális utasításokat.
- A kisebb adattípusból a nagyobb adattípussá történő konvertálást típus-promóciónak is nevezik . A fenti példában azt is mondhatjuk, hogy s értékét egész számra emeljük.
- Az implicit típusú konverzió mindig a kompatibilis adattípusokkal történik.
Nem végezhetünk implicit típusú öntést az egymással nem kompatibilis adattípusokon, például:
- Az úszó int-vé konvertálása meg fogja csonkolni a törtrészt, így elveszíti az érték jelentését.
- A dupla lebegővé konvertálása felfelé kerekíti a számjegyeket.
- A hosszú int-nek konvertálása feleslegesen magas rendű bitek esését okozza.
A fenti esetek mindegyikében, amikor átalakítjuk az adattípusokat, az érték elveszíti értelmét. Általában az érték jelentésvesztését figyelmezteti a fordító.
A „C” programozás a típuskészítés egy másik módját biztosítja, amely az explicit típusú casting.
Explicit típusú casting
Az implicit típusú konverzióban az adattípus automatikusan konvertálódik. Vannak olyan esetek, amikor előfordulhat, hogy kényszerítenünk kell a típusátalakítást. Tegyük fel, hogy van egy div változónk, amely két operandus osztását tárolja, amelyeket int adattípusként deklarálunk.
int result, var1=10, var2=3;result=var1/var2;
Ebben az esetben a var1 és var2 változókkal végzett osztás után az "eredmény" változóban tárolt eredmény egész formátumú lesz. Valahányszor ez megtörténik, az "eredmény" változóban tárolt érték elveszíti értelmét, mert nem veszi figyelembe azt a törtrészt, amelyet általában két szám felosztásakor kapunk.
A típuskonvertálás kényszerítésére ilyen helyzetekben explicit típusú castingot használunk.
Típusöntő operátort igényel. A típusú öntési műveletek általános szintaxisa a következő:
(type-name) expression
Itt,
- A típusnév a szokásos „C” nyelvű adattípus.
- Egy kifejezés lehet konstans, változó vagy tényleges kifejezés.
Írjunk egy programot az explicit típus-casting megvalósításának bemutatására a C-ben.
#includeint main(){float a = 1.2;//int b = a; //Compiler will throw an error for thisint b = (int)a + 1;printf("Value of a is %f\n", a);printf("Value of b is %d\n",b);return 0;}
Kimenet:
Value of a is 1.200000Value of b is 2
- Inicializáltuk az a típusú változó float változót.
- Ezután még egy „b” változót kapunk egész típusú adattípusból. Mivel az „a” és „b” változó különböző adattípusú, a „C” nem engedélyezi az ilyen kifejezés használatát, és hibát fog felvetni. A „C” egyes verzióiban a kifejezés kiértékelésre kerül, de az eredmény nem lesz kívánatos.
- Az ilyen helyzetek elkerülése érdekében a float típusú „a” változót megadjuk. Az explicit típusú casting módszerek használatával sikeresen átalakítottuk a float adattípusú egész számokká.
- Van egy nyomtatott "a" értéke, amely még mindig úszó
- A tipizálás után az eredmény mindig „b” egész szám lesz.
Ily módon megvalósíthatjuk az explicit típusú castingot a „C” programozásban.
Összegzés
- A típusírást másolásnak is nevezzük
- Ez azt jelenti, hogy az egyik adattípust átalakítják másikká.
- A kisebb adattípus nagyobbá konvertálását típus-promóciónak is nevezik.
- A „C” implicit és explicit módon biztosítja a típusátalakítást.
- Az implicit típuskonvertálás automatikusan működik, ha megtalálható a kompatibilis adattípus.
- Az explicit típusú konverzióhoz típus-casting operátor szükséges.
Ne felejtse el a következő szabályokat a programozási gyakorlatra, amikor különböző adattípusokkal foglalkozik az adatvesztés megelőzése érdekében:
- Az egész számokat úszóvá kell alakítani.
- Az úszó típusokat kettőssé kell átalakítani.
- A karaktertípusokat egész számokká kell konvertálni.