C kerdes
Andras Tantos
andras at tantosonline.com
Thu Mar 22 20:04:59 CET 2007
Hali!
Ez ennel kicsit (sokkal) bonyolultabb. A C++ szbvany szerint a kovetkezok
tortennek:
Egy 'c-style' konverzio, azaz (int)x, a kovetkezoket jelentheti:
const_cast
static_cast
const_cast egy static_cast utan
reinterpret_cast
const_cast egy reinterpret_cast utan.
Ezeket ebben a sorrendben kell probalni, es ha valamelyik ertelmes, akkor a
konverziot akkent kell ertelmezni, meg akkor is, ha a keletkezo program nem
fordithato le. Ez esetben a fordito forditasi hibat kell generaljon.
A const_cast egyszeruen azt jelenti, hogy a 'const' tipus-modosito jelzot el
lehet venni, vagy hozza lehet rakni a tipushoz
A static_cast a kovetkezoket jelenti:
=====================================
Egesz tipusok kozotti konverzio (azaz mind az eredeti, mind a konvertalt
tipus egesz)
-------------------------------------------------------------------------------------
Ha a cel tipus 'unsigned' akkor az eredmeny a megfelelo szamu bitre
kiegeszitett (vagy csonkolt) szam lesz.
Ha a cel tipus 'signed' akkor az eredmeny a megfelelo szamu bitre
(elojelhelyesen) kiegeszitett szam lesz, felteve, hogy az eredeti ertek
abrazolhato az uj tipusban. Ha az eredeti ertek nem abrazolhato az uj
tipusban, akkor az eredmeny fordito-fuggo.
Lebego-pontos tipusok kozotti konverzio (azaz mind az eredeti, mind a
konvertalt tipus lebego pontos)
-------------------------------------------------------------------------------------
Ha a forras-ertek pontosan abrazolhato a cel tipusban, akkor az ertek nem
valtozik, egyebkent a viselkedes fordito-fuggo.
Lebego-pontosrol egeszre konvertalas
------------------------------------
A konverzio csonkol, azaz a torteszt nem veszi figyelembe. Ha a csonkolt
ertek nem abrazolhato a cel-tipusban, az eredmeny nem definialt.
Egeszrol lebego-pontsora konvertalas
------------------------------------
A konvertalt ertek megegyezik az eredeti ertekkel, ha ez lehetseges, ha nem,
akkor a viselkedes fordito-fuggo.
Pointer konvertalas
-------------------
Az (egesz) 0 szam mindig konvertalhato barmilyen pointer tipusra.
Barmilyen pointer tipus konvertalhato 'void *'-ra
Egyebek:
--------
Egy pointer konvertlhato egy azonos tipusu tombre, es viszont.
Egy fuggveny konvertalhato a megfelelo tipusu fuggveny-pointerre.
A reinterpret_cast a kovetkezoket jelenti:
==========================================
Egy pointer konvertalhato egy egesz tipusra, ami legalabb akkor, mint a
pointer.
Egy egesz tipus konvertalhato egy pointer tipusra.
Ket tetszoleges pointer tipus konvertalhato a masikba, nehany aranylag
magatolertetodo kiveteltol eltekintve (pl. alignment problemak).
Ugy altalaban a 'mapping' azaz, hogy a konverzio eredmenye mi lesz, az
fordito fuggo. Altalaban csak annyi garanciat ad a szabvany, hogy egy
oda-vissza konvertalas nem szabad, hogy megvaltoztassa az erteket.
A referencia, 'bool', 'objektum-pointer' es 'pointer-to-member' konverziokat
most hagyjuk, mert azok C-nel nem jattszanak. Az 'enum'-okat meg azert
hagytam ki, mert azok kicsit maskent mukodnek C++-ben, mint C-ben. Szinten
nem foglalkoztam itt a konverzios operatorokkal es konstruktorokkal, amik a
kepet meg jobban bonyolitjak: ezek sem C nyelvi elemek.
Meg egyszer: amit leirtam, az a C++-ra igaz, a C szabvany kicsit lehet, hogy
maskent irja le ezeket a dolgokat, de lenyegeben ugyanerre az eredmenyre
kell vezessen talan egy-ket igen szelsoseges esetet leszamitva.
Osszefoglalva az egesz oda vezet, hogy ha ertelmesen konvertalhato a
forras-tipus a cel tipusba, akkor ertelmesen kell konvertalni, egyebkent meg
ugy kell venni, hogy az adott memoria darabon mostantol az uj tipus foglal
helyet.
Udv,
Tantos Andras
----- Original Message -----
From: "vajk fekete" <halaloszto at yahoo.co.uk>
To: <elektro at tesla.hu>
Sent: Thursday, March 22, 2007 5:07 AM
Subject: Re: C kerdes
Koszi!
Akkor a (tipus)valtozo alaku dolog az egy rendes atalakitas, nem csak egy
kenyszerites.
vajk
----- Original Message ----
From: Szima Gábor <sygma at tesla.hu>
To: elektro at tesla.hu
Sent: Thursday, 22 March, 2007 12:45:24 PM
Subject: Re: C kerdes
On Thu, 22 Mar 2007, vajk fekete wrote:
> double d;
> int i=1;
>
> d=i;
> d=(double)i;
>
> ez a keto ugyanazt csinalja?
Igen.
Ez viszont nem:
int a=1, b=2;
d=a/b;
d=(double) a / (double) b;
-Sygma
-----------------------------------------
elektro[-flame|-etc]
___________________________________________________________
New Yahoo! Mail is the ultimate force in competitive emailing. Find out more
at the Yahoo! Mail Championships. Plus: play games and win prizes.
http://uk.rd.yahoo.com/evt=44106/*http://mail.yahoo.net/uk
-----------------------------------------
elektro[-flame|-etc]
More information about the Elektro
mailing list