{"id":6537,"date":"2011-04-08T10:30:14","date_gmt":"2011-04-08T08:30:14","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=6537"},"modified":"2011-10-05T12:21:38","modified_gmt":"2011-10-05T10:21:38","slug":"6-le-variabili-e-i-tipi-di-dato","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/6-le-variabili-e-i-tipi-di-dato\/","title":{"rendered":"6. Le variabili e i tipi di dato"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/corso-completo-c-variabili-e-tipi-di-dato-00.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/04\/corso-completo-c-variabili-e-tipi-di-dato-00.jpg\" alt=\"corso-completo-c-variabili-e-tipi-di-dato-00\" title=\"corso-completo-c-variabili-e-tipi-di-dato-00\" width=\"200\" height=\"100\" class=\"alignleft size-full wp-image-6558\" \/><\/a> Sicuramente avrete gi\u00e0 incontrato nei vostri studi il concetto di variabile, almeno in matematica  dove si fa un gran parlare di variabile x, variabile y, funzione a due variabili etc.<br \/>\nIn generale una variabile \u00e8 qualcosa che puo&#8217; assumere, a seconda del contesto, valori diversi. Ad esempio nella funzione f(x) = x+3  la variabile x non ha un valore predeterminato ma assume via via valori diversi a seconda del contesto.<br \/>\nIn un ipotetico algoritmo potremmo trovare qualcosa del genere: (attenzione, il codice \u00e8 esemplificativo non provate a compilarlo)<!--more--><\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nx = temperatura_cpu();\r\nse x > 30\r\n  accendi_condizionatore();\r\naltrimenti\r\n  spegni_condizionatore();\r\n<\/pre>\n<p>la variabile x non ha un valore predeterminato ma ciascuna volta che l&#8217;istruzione &#8220;x = temeratura_cpu();&#8221; viene eseguita assumer\u00e0 un valore diverso.<br \/>\nOvviamente in programmazione si fa un larghissimo uso delle variabili senza le quali i programmi avrebbero un comportamento deterministico, mentre invece analizzando il valore assunto via via dalle variabili si riesce ad ottenere un comportamento diversificato.<\/p>\n<h4>Campo di variabilit\u00e0<\/h4>\n<p>Quando si parla di variabili \u00e8 indispensabile specificare qual \u00e8 il campo di variabilit\u00e0, \u00e8 necessario chiarire quindi quali sono i valori che la variabile pu\u00f2 assumere. Tornando all&#8217;esempio matematico, la funzione f(x) = x + 3 non specifica da sola quali sono i valori che la x pu\u00f2 assumere, anche se di norma quando si usa la x si sottointende che la variabile pu\u00f2 assumere tutti i valori della retta reale, mentre se la variabile \u00e8 una <em>n<\/em> allora \u00e8 sottointeso che possa assumere tutti i valori nei naturali. In ogni caso per maggiore precisione si pu\u00f2 sempre specificare i valori assunti con la sintassi f: R->R.<br \/>\nQuesta premessa matematica solo per sottolineare che quando si parla di variabile \u00e8 imprescindibile definire anche il suo campo di variabilit\u00e0.<br \/>\nQuando poi le variabili entrano a far parte dei nostri programmi definire il campo di variabilit\u00e0 non \u00e8 solo questione di formalismi, ma diventa una vera e propria necessit\u00e0 tecnica.<br \/>\nPer comprendere il perch\u00e8 di questa necessit\u00e0 dobbiamo premettere che le informazioni all&#8217;interno della memoria del computer occupano pi\u00f9 o meno spazio a seconda del tipo, non \u00e8 difficile immaginare che un singolo carattere &#8220;A&#8221; occupi in memoria meno spazio di quanta ne occupi tutto il testo della divina commedia. Quindi se nel nostro programma stiamo utilizzando una variabile e il suo valore per definizione non \u00e8 definito a priori,  bisogna stabilire quanto spazio riservarle. Se la variabile non fosse accompagnata da un campo di variabilit\u00e0 come ad esempio &#8220;testo lungo massimo 100 caratteri&#8221; non potremmo mai sapere quanto spazio riservarle e correremmo sempre il rischio che la variabile necessiti di pi\u00f9 spazio di quello che le abbiamo riservato. \u00c8 un p\u00f2 come sapere che devono arrivare ospiti a cena ma ignorare se saranno 1, 10,100 e cos\u00ec via.<\/p>\n<h4>Tipi di dato<\/h4>\n<p>Il campo di variabilit\u00e0 all&#8217;interno dei programmi si definisce impostando un tipo per la variabile. Questo modo di fare ovviamente non \u00e8 nuovo, anche in matematica \u00e8 lecito definire una funzione f(x) = x + 3 con x \u2208 R, il che significa di fatto specificare che x \u00e8 di tipo Reale.<br \/>\nTra i linguaggi di programmazione esistono linguaggi che si dicono fortemente, debolmente o non tipizzati. Il C appartiene alla categoria dei debolmente tipizzati, questo significa che se avete dichiarato una variabile di un tipo, e questo tipo di dato occupa una certa quantit\u00e0 di spazio in memoria, allora la variabile potr\u00e0 essere trattata come se fosse di qualsiasi altro tipo di dato che occupa in memoria la medesima quantit\u00e0 di spazio. Questa \u00e8 una di quelle caratteristiche che fanno si che il C venga considerato un linguaggio relativamente a basso livello perch\u00e9 non si interessa della semantica e del fatto che abbiamo dichiarato una variabile (ad esempio) per contenere un carattere ed invece poi la utilizziamo per memorizzare un numero, perch\u00e9 se i due tipi di dato occupano la stessa quantit\u00e0 di spazio questo non influenza la struttura della memoria e il C &#8220;fa solo quello che gli chiedi&#8221;.<br \/>\nAltri linguaggi come il Java, invece, si dicono fortemente tipizzati perch\u00e8 non godono della stessa libert\u00e0 del C, ma generano un errore se ti tenta di utilizzare una variabile di un tipo come se fosse di un tipo differente. (Ci sono alcune eccezioni, ma riguardano la programmazione ad oggetti, resta valido il principio generale)<\/p>\n<h4>I tipi di dato primitivi del C<\/h4>\n<p>Prima di definire quali sono i tipi di dato primitivi del C bisogna precisare che vista la diffusione del linguaggio e del proliferare di compilatori per le architetture piu diverse, non \u00e8 difficile riscontrare differenze tra il proprio compilatore e la definizione ufficiale del linguaggio.<br \/>\nI tipi di dato ufficiali utilizzabil in C sono i seguenti:<\/p>\n<ul>\n<li><strong>char<\/strong>: Utilizzato per memorizzare un singolo carattere, occupa generalmente un Byte (8 bit)<\/li>\n<li><strong>int<\/strong>: Utilizzato per memorizzare numeri interi, occupa generalmente 4 byte (32bit) quindi pu\u00f2 memorizzare numeri interi compresi nel range da \u22122.147.483.648  fino a +2.147.483.647 (ricordiamo che 2^32 = 4.294.967.296)<\/li>\n<li><strong>float<\/strong>: Utilizzato per memorizzare numeri a virgola mobile con precisione singola, occupa 4 Byte come un int.<\/li>\n<li><strong>double<\/strong>: Utilizzato per memorizzare numeri in virgola mobile con precisione doppia, occupa 8 Byte (128bit)<\/li>\n<\/ul>\n<p>Oltre a questi semplici tipi di dato esistono dei modificatori, che possono affiancare il tipo di dato creando:<\/p>\n<ul>\n<li><strong>long int:<\/strong><\/li>\n<li><strong>short int:<\/strong><\/li>\n<\/ul>\n<p>per questi modificatori \u00e8 stata lasciata carta bianca sull&#8217;implementazione ai produttori di compilatori, le uniche regole che lo standard detta sono:<\/p>\n<ol>\n<li>Il tipo Short Int deve essere almeno di 16 bit.<\/li>\n<li>Il tipo Long int deve essere almeno di 32 bit.<\/li>\n<li>Il tipo Short int non non pu\u00f2 essere pi\u00f9 grande del tipo Int<\/li>\n<li>Il tipo Int non pu\u00f2 essere pi\u00f9 grande del tipo Long Int.<\/li>\n<\/ol>\n<p>Altri due modificatori sono:<\/p>\n<ul>\n<li><strong>Signed<\/strong><\/li>\n<li><strong>Unsigned<\/strong><\/li>\n<\/ul>\n<p>che si possono affiancare a char e int per creare signed\/unsigned char e signed\/unsigned int.<br \/>\nDi default le variabili di tipo char e int vengono definite signed quindi il loro range di variabilit\u00e0 e rispettivamente [-127;+128] e [\u22122.147.483.648; +2.147.483.647] mentre se dichiarate unsigned con lo stesso numero di bit possiamo spostare il range di variabilit\u00e0 portandolo a [0;255] e [0;4.294.967.296]<\/p>\n<h4>La dichiarazione delle variabili<\/h4>\n<p>Dopo tanta teoria mi sembra il caso di vedere qualche piccolo esempio di come vengono dichiarate le variabili in C.<br \/>\nAll&#8217;interno di un blocco di codice \u00e8 buona norma scrivere la dichiarazione delle variabili prima di tutte le altre istruzioni, in questo modo il codice di mantiene pulito e pi\u00f9 facile da leggere.<br \/>\nLa dichiarazione di una variabile segue la sintassi<\/p>\n<p><em>tipo_di_dato nome_variabile;<\/em><\/p>\n<p>Questa istruzione avvisa il compilatore che nel codice verr\u00e0 utilizzata una variabile di nome nome_variabile ed il tipo \u00e8 tipo_di_dato ed \u00e8 quindi necessario riservarle in memoria lo spazio sufficiente.<\/p>\n<p>Vediamo in questo esempio come vengono dichiarate variabili:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint main (int argc, char **argv)\r\n{\r\n        int variabileIntera;\r\n        float variabileFloat;\r\n        short int variabileShortInt;\r\n        \u2026\r\n        \u2026\r\n}\r\n<\/pre>\n<p>In questo esempio abbiamo dichiarato tre variabli, una di tipo int, una di tipo float e una di tipo short int. Sul mio pc queste tre istruzioni fanno si che il compilatore riservi 10 byte di memoria per queste tre variabili, 4 byte per l&#8221;int ed il float e 2 per lo short int.<\/p>\n<p>Esistono alcune regole che permettono di risparmiare righe di codice quando si scrive un programma, per esempio \u00e8 possibile dichiarare pi\u00f9 variabili dello stesso tipo nella stessa riga di codice separandole da una virgola.<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint main (int argc, char **argv)\r\n{\r\n        int primaVariabile, secondaVAriabile;\r\n}\r\n<\/pre>\n<p>oppure \u00e8  possibile dichiarare una variabile e assegnarle immediatamente un valore<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint main (int argc, char **argv)\r\n{\r\n        int variabileIntera = 42;\r\n}\r\n<\/pre>\n<p>Attenzione a non cadere in errore, questo codice:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint main (int argc, char **argv)\r\n{\r\n        int variabileUno, variabileDue = 42;\r\n}\r\n<\/pre>\n<p>assegna il valore 42 solo a variabileDue, non ad entrambe le variabili.<\/p>\n<h4>Inizializzazione delle variabili<\/h4>\n<p>L&#8217;operazione di dichiarazione di una variabile, abbiamo detto pi\u00f9 volte, si occupa solo di riservare il giusto numero di byte nella memoria, ma non fa null&#8217;altro, soprattutto va notato che l&#8217;area della memoria destinata alla variabile non viene &#8220;azzerata&#8221; in alcun modo, ma resta &#8220;sporca&#8221; dei dati del programma che l&#8217;ha utilizzata prima.<br \/>\nQuesto \u00e8 causa di molti mal di testa ai programmatori meno esperti, perch\u00e9 se nel nostro programma tentiamo di leggere il valore di una variabile appena istanziato otterremo ogni volta valori diversi, perch\u00e9 il valore dipende da quello che \u00e8 rimasto sulla memoria dai programmi precedenti. Per questo bisogna accertarsi sempre che la prima operazione effettuata su una variabile non sia quella di leggerne il valore, ma bens\u00ec quello si assegnarlo. Il processo di assegnare un valore alla variabile appena dichiarata si chiama Inizializzazione.<\/p>\n<table>\n<tr>\n<td>Metodo corretto: viene inizializzato il valore della variabile prima di leggerlo.<\/td>\n<td>Metodo errato: non viene inizializzata la variabile.<\/td>\n<\/tr>\n<tr>\n<td>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">int main (int argc, char **argv)\r\n{\r\n        int variabileIntera = 0;\r\n        \u2026\r\n        se variabileIntera = 0\r\nallora\r\n\u2026\r\naltrimenti\r\n\u2026\r\n}<\/pre>\n<\/td>\n<td>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">int main (int argc, char **argv)\r\n{\r\n        int variabileIntera;\r\n        \u2026\r\n        se variabileIntera = 0\r\nallora\r\n\u2026\r\naltrimenti\r\n\u2026\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/table>\n<p>L&#8217;operazione di inzializzazione dipende dal tipo della variabile da inizializzare, in questo momento abbiamo incontrato solo variabili di tipo numerico (int, long int etc) e la variabile char che contiene un solo carattere ascii. per queste due variabili l&#8217;inzializzazione si fa in questo modo:<\/p>\n<p><center><\/p>\n<table>\n<tr>\n<td><strong>Variabile di tipo numerico:<\/strong><br \/>\nint nome_variabile;<br \/>\nnome_variabile = 42;<\/td>\n<td><strong>Variabile di tipo char:<\/strong><br \/>\nchar nome_variabile<br \/>\nnome_variabile = &#8216;A&#8217;;<\/td>\n<\/tr>\n<\/table>\n<p><\/center><\/p>\n<h4>Sui nomi delle variabili<\/h4>\n<p>Se credete che attribuire un nome ad una variabile sia una cosa semplice allora avete ancora scritto poche righe di codice \ud83d\ude42<\/p>\n<p>Oltre alle regole dettate dal C che sono:<\/p>\n<ol>\n<li>Il primo carattere del nome di una variabile deve essere una lettera o un underscore ( _ );<\/li>\n<li>i caratteri successivi possono essere lettere, numeri o underscore.<\/li>\n<\/ol>\n<p>e che non creano di norma alcun problema, resta il problema di assegnare dei nomi<\/p>\n<ul>\n<li><strong>significativi<\/strong>: supponiamo di trovare una riga di codice in cui c&#8217;\u00e8 scritto: if (pippo > 18 ) then purtroppo l&#8217;aver chiamato la variabile pippo non ci aiuta nella comprensione del codice, mentre se avessimo scritto if (anni > 18) then tutto sarebbe pi\u00f9 chiaro. Di solito per essere rendere un nome significativo si possono concatenare due nomi, creando per esempio variabili come annoDiNascita, speseBancarie, numMatricola etc.<\/li>\n<li><strong>coerenti<\/strong>: esistono diverse scuole di pensiero su come dovrebbero essere scritti i nomi delle variabli (link) ma la cosa pi\u00f9 importante indipendentemente da quale stile vogliate seguire \u00e8 essere coerenti. Se decidete di utilizzare nomi come annoDiNascita non utilizzate nello stesso progetto variabili che si chiamano anno_di_matrimonio perch\u00e9 questa incoerenza vi far\u00e0 perdere un mare di tempo. Una mia personale convenzione \u00e8 quella di utilizzare l&#8217;iniziale minuscola e poi tutte le iniziali delle eventuali parole successive maiuscole.<\/li>\n<li><strong>brevi<\/strong>: ok per la significativit\u00e0, ma una variabile che si chiama temperaturaCPURilevataDalTermostatoInterno \u00e8 veramente troppo!<\/li>\n<li><strong>facili da scrivere<\/strong>: TeMpErATuRa non \u00e8 un nome molto comodo da scrivere, soprattutto se doveste scriverlo cento volte nel vostro progetto!<\/li>\n<\/ul>\n<h4>Prossimamente<\/h4>\n<p>Nella prossima lezione metteremo in pratica quello che abbiamo imparato in questa lezione, scriveremo un programma che utilizzi un p\u00f2 di variabili e vedremo gli operatori logico \/ matematico di base.<\/p>\n<h4>Letture consigliate:<\/h4>\n<p><a href=\"http:\/\/www.amazon.it\/gp\/search\/ref=as_li_qf_sp_sr_il_tl?ie=UTF8&#038;keywords=887192200X&#038;tag=de0d-21&#038;index=aps&#038;linkCode=as2&#038;camp=3370&#038;creative=23322\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/C-Corso-Completo-di-Programmazione-kernighan-ritchie-devAPP.jpg\" alt=\"C-Corso-Completo-di-Programmazione-kernighan-ritchie-devAPP\" title=\"C-Corso-Completo-di-Programmazione-kernighan-ritchie-devAPP\" width=\"54\" height=\"75\" class=\"alignleft size-full wp-image-7803\" \/><\/a> <a href=\"http:\/\/www.amazon.it\/gp\/search\/ref=as_li_qf_sp_sr_il_tl?ie=UTF8&#038;keywords=887192200X&#038;tag=de0d-21&#038;index=aps&#038;linkCode=as2&#038;camp=3370&#038;creative=23322\" target=\"_blank\"><strong>Il linguaggio C. Principi di programmazione e manuale di riferimento (Accademica) <\/strong><\/a><br \/>\n<em>Brian W. Kernighan &#8211; Dennis M. Ritchie<\/em><br \/>\n<strong>Editore:<\/strong> Pearson | <strong>Lingua:<\/strong> Italiano | <strong>Brossura:<\/strong> 313 pagine<br \/>\n<strong>Prezzo Listino:<\/strong> <del datetime=\"2011-09-03T10:00:08+00:00\">EUR 27,00<\/del><br \/>\n<strong>Prezzo Promozione:<\/strong> EUR 22,95 con Spedizione gratuita<\/p>\n<p><a href=\"http:\/\/www.amazon.it\/gp\/product\/8850329547\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&#038;tag=de0d-21&#038;linkCode=as2&#038;camp=3370&#038;creative=23322&#038;creativeASIN=8850329547\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/09\/C-Corso-Completo-di-Programmazione-Deitel-Deitel-devAPP.jpg\" alt=\"C-Corso-Completo-di-Programmazione-Deitel-Deitel-devAPP\" title=\"C-Corso-Completo-di-Programmazione-Deitel-Deitel-devAPP\" width=\"54\" height=\"75\" class=\"alignleft size-full wp-image-7550\" \/><\/a> <a href=\"http:\/\/www.amazon.it\/gp\/product\/8850329547\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&#038;tag=de0d-21&#038;linkCode=as2&#038;camp=3370&#038;creative=23322&#038;creativeASIN=8850329547\" target=\"_blank\"><strong>C. Corso completo di programmazione<\/strong><\/a><br \/>\n<em>Paul J. Deitel &#8211; Harvey M. Deitel<\/em><br \/>\n<strong>Editore:<\/strong> Apogeo | <strong>Lingua:<\/strong> Italiano | <strong>Brossura:<\/strong> 640 pagine<br \/>\n<strong>Prezzo Listino:<\/strong> <del datetime=\"2011-09-03T10:00:08+00:00\">EUR 39,00<\/del><br \/>\n<strong>Prezzo Promozione:<\/strong> EUR 33,15 con Spedizione gratuita<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/supporto-applicazioni\/le-applicazioni-dei-nostri-autori\/parole-vietate-di-ignazio-calo\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/bannerIgnazioc.png\" alt=\"\" width=\"480\" height=\"100\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sicuramente avrete gi\u00e0 incontrato nei vostri studi il concetto di variabile, almeno in matematica dove si fa&#8230;<\/p>\n","protected":false},"author":53,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[569],"tags":[593,588,676,241,637,638,675,674],"class_list":["post-6537","post","type-post","status-publish","format-standard","hentry","category-corso-completo-di-c","tag-corso-completo-di-c-2","tag-corso-di-c","tag-dichiarazione-variabili-c","tag-ignazio-calo","tag-programmare-c-mac","tag-programmazione-c-windows","tag-tipi-di-dato-c","tag-variabili-c"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6537","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=6537"}],"version-history":[{"count":10,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6537\/revisions"}],"predecessor-version":[{"id":7810,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6537\/revisions\/7810"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=6537"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=6537"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=6537"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}