Newsgroup: it.comp.lang.c++
Titolo: variabili e costanti

Quali sono i tipi di variabili e di costanti?
Per ora conosco
char
int
double
long
Quali altre ci sono?
  -----------== Posted via Newsfeeds.Com, Uncensored Usenet News ==----------
 
http://www.newsfeeds.com
       The Largest Usenet Servers in the World!
------== Over 73,000 Newsgroups - Including  Dedicated  Binaries Servers ==-----

 Quali altre ci sono?
Esistono un numero infinito di tipi, poiche`:
    -- a vari tipi-base, indicati da apposite keyword,
        si possono apporre un numero illimitato di
        modificatori (e altri compositori di tipi)
    -- si possono definire tipi nuovi con le keyword
        struct, class, enum, union, ...
"long" e` un modificatore, diciamo un "aggettivo";
se non viene detto esplicitamente a quale "sostantivo"
si applichi, per default e` "int" (ma c'e` anche,
per esempio, "long double").
Altri modificatori che sono keyword comprendono
"signed" e "unsigned".  Non tutte le combinazioni
sono possibili (ad esempio "unsigned double" e`
vietata) e non tutte quelle possibili sono distinte
("char", "signed char", e "unsigned char", sono
tre tipi distinti; ma "int" e "signed int" sono lo
stesso tipo, distinto da "unsigned int").
Alcuni dei modificatori piu` importanti non sono
keyword ma diverse notazioni.  Ad esempio, "*"
puo` essere apposto (una o piu` volte) per
indicare "indirettezza", ovvero "e` puntatore a".
[Non e` del tutto corretto considerare "*" come
parte della _dichiarazione_ del tipo, ma e`
corretto considerarlo parte del _tipo_ in se`. Si`,
e` una distinzione sottilissima e astrusa, ma,
d'altra parte, il C++ stesso _e`_, in tante, ma
tante cose, astruso e sottilissimo...].
Altri modificatori sono "&" ("reference", una
specie di puntatore ma con sottilissime e
astruse differenze:-), "[]" ("array di"), "()"
("funzione che ritorna un")...
A qualsiasi tipo puoi dare un nome con la
keyword typedef.  Ad esempio:
typedef int    uno;    // un dato
typedef int*  due;    // puntatore a int
typedef int** tre;    // puntatore a puntatore a int
typedef int*** quattro;    // puntatore a ... (ecc)
typedef int funz();        // funzione che torna un int
typedef int (*pfunz)();    // puntatore a f.c.t.u.i
typedef int (**ppfunz)();    // puntatore a puntatore a f.c.t.u.i
e cosi` via (per complicare ulteriormente le cose,
le parentesi "()" possono servire a raggruppare 
i vari segni in ordine di precedenza, oppure, in
altri casi, a indicare "funzione che ritorna un"...).
Non cadere nell'errore di pensare che questi non
siano "veri tipi".  Lo sono a tutti gli effetti; e` solo
che il loro "vero nome" e` sintatticamente molto
complicato (per questo typedef viene comoda...),
pero`, volendo, si potrebbe indicarlo -- ad es:
    void plippo(int (**)());
L'"impronunciabile" tipo qui dichiarato come
argomento della funzione plippo e` lo stesso
che poco fa, grazie a una typedef, avevamo
"soprannominato" ppfunz.  Fra le complicazioni
sintattiche suaccennate, c'e` quella che, se
vuoi dare un nome a una variabile (o costante)
di quel tipo, devi mettere il nome "nel bel
mezzo" del tipo, ad esempio...:
    void plappo(int (**klik)());
la plappo prende un argomento esattamente
dello stesso tipo che vuole la plippo, l'unica
differenza (semanticamente irrilevante) e`
che qui gli abbiamo dato nome "klik", mentre
a quello della plippo non avevamo dato un
nome formale.
typedef puo` salvarti la vita, la vista, e la
sanita` mentale...:-).
Alex

 Quali sono i tipi di variabili e di costanti?
Non fai prima a consultare un buon libro sul C++ come Thinking in C++ di
Bruce Eckel che trovi in rete? Un newsgroup non può e non deve
sostituirsi al sano studio del linguaggio.
EMG

>stesso tipo, distinto da "unsigned int").
Mi spieghi come mai char e' diverso da signed char? in cosa e' diverso 
esattamente?
grazie
-- 
  . 
darX...@tin.it
      . 
darx...@wappi.com
 (GSM SMS)
   . Fido 2:335/241.5     . 
http://darxstar.cjb.net
  ICQ UIN# 11151997 -   
  trough Britannia: Gwydion the Mage <UO: EUROPA,now in Trisinc>
---
I don't want my freedom: there's no reason for living, with a broken heart
 -- The Queen

 esattamente?
Dipende dalla piattaforma.  Certe macchine, come ad esempio
i mainframe IBM, hanno di natura i caratteri unsigned; su quelle
macchine, "char" sara` in effetti un tipo unsigned, e quindi la
differenza da "signed char" e` piuttosto evidente, spero.  Su
altre macchine, i caratteri, di natura, sono invece signed.
Il punto chiave e` che "char" indica un tipo di cui _non ti
interessa_ la 'signedness'; sara` un tipo signed su alcune
macchine, unsigned su altre, e tu _non farai conto_ ne`
su una delle due circostanze, ne` sull'altra.  Invece,
"signed char" significa che fai conto sul segno (il tipo
deve essere in grado di rappresentare valori fra -127
e +127 o piu`), "unsigned char" significa che fai conto
sull'assenza di segno (il range garantito e` da 0 a
255 in questo caso).
Anzitutto, quindi, una differenza di portabilita`.
A _causa_, se vuoi, di questa differenza, "char" risulta
distinto da "signed char" su _qualsiasi_ piattaforma, in
modo indipendente da "come" siano ivi i caratteri.
Esattamente come sono due tipi distinti le enum...:
    enum pippo { buh, bah };
    enum pluto { buh, bah };
"Distinti in cosa", chiedi?  Distinti nella loro identita`,
nel loro nome.  Infatti puoi fare l'overload di tipo:
    int plep(pippo plic);
    int plep(pluto plic);
e sono due funzioni completamente distinte fra loro,
esattamente come lo sono:
    int klok(signed char);
    int klok(char);
    int klok(unsigned char);
tre funzioni completamente diverse e neppure parenti
fra loro (anche se sarebbe ovviamente poco saggio
che non facessero grosso modo "lo stesso lavoro", ma
il linguaggio non te lo impone in alcun modo).
Alex