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