{"id":6462,"date":"2011-04-01T14:30:15","date_gmt":"2011-04-01T12:30:15","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=6462"},"modified":"2011-10-05T12:21:08","modified_gmt":"2011-10-05T10:21:08","slug":"5-introduzione-al-c","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/5-introduzione-al-c\/","title":{"rendered":"5. Introduzione al C"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-al-linguaggio-c-00.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/corso-completo-c-introduzione-al-linguaggio-c-00.jpg\" alt=\"corso-completo-c-introduzione-al-linguaggio-c-00\" title=\"corso-completo-c-introduzione-al-linguaggio-c-00\" width=\"200\" height=\"100\" class=\"alignleft size-full wp-image-6469\" \/><\/a> In questa lezione inizieremo ad analizzare la sintassi del linguaggio C, quali sono le regole alle quali bisogna attenersi per non avere errori in fase di compilazione e qual \u00e8 la struttura generale di un programma.<br \/>\nUn primo aspetto molto importante da sottolineare \u00e8 che il linguaggio C \u00e8 case-sensitive, fa quindi distinzione tra caratteri minuscoli e maiuscoli: se nel nostro programma scriviamo <em>Printf<\/em> invece di  <em>printf<\/em> otterremo un errore bloccante in fase di compilazione. In alcuni casi questi errori possono rivelarsi di facile risoluzione, ma altre volte possono rivelarsi molti insidiosi, quindi \u00e8 bene iniziare fin da subito ad utilizzare delle convenzioni nella scelta dei caratteri maiuscoli\/minuscoli e fare molta attenzione in fase di stesura del codice.<!--more--><\/p>\n<p>Un secondo aspetto, che in alcuni casi \u00e8 causa di fraintendimenti, \u00e8 che il C non tiene conto di spazi ripetuti, n\u00e8 tabulazioni ripetute n\u00e8 &#8220;a capo&#8221; quindi un programma potrebbe essere scritto, se solo lo si volesse, anche su una sola riga.<\/p>\n<p>Nonostante questa libert\u00e0, o forse dovremmo dire a causa di questa libert\u00e0, esistono delle convenzioni sugli &#8220;a capo&#8221; e tabulazioni che prendono il nome di regole di indentazione che servono a rendere il codice pi\u00f9 leggibile. Pi\u00f9 avanti vedremo come scrivere un programma in maniera chiara seguendo queste convenzioni.<\/p>\n<p>In questi articoli cercher\u00f2 di attenermi allo stile di indentazione denominato <em>K&amp;R<\/em> dal nome degli autori B. Kernighan e D. Ritchie, autori del testo &#8220;The C Programming language&#8221; (<a href=\"http:\/\/en.wikipedia.org\/wiki\/The_C_Programming_Language_%28book%29\" target=\"_blank\">link<\/a>) ritenuto, ancora oggi, la vera &#8220;bibbia&#8221; del linguaggio C. Purtroppo in certe occasioni l&#8217;indentazione del codice non sar\u00e0 perfetta a causa di problemi di impaginazione, chiedo perdono in anticipo.<\/p>\n<h4>I commenti<\/h4>\n<p>All&#8217;interno del codice di un programma spesso \u00e8 necessario, o utile, inserire dei commenti, ovvero delle annotazione che spieghino dei passaggi particolarmente complessi alle persone che lo leggeranno. Addirittura potrebbe capitare proprio a noi stessi, magari dopo qualche anno dalla stesura di un programma, di dover rimettere mano, per una qualsiasi ragione, al nostro stesso codice e voler continuare a capirci qualcosa senza troppe difficolt\u00e0 e perdite inutili di tempo.<\/p>\n<p>I commenti vengono del tutto ignorati dal compilatore, \u00e8 quindi possibile scrivere tutto senza preoccuparsi di errori sintattici.<\/p>\n<p>Esistono due tipi di commenti in C, il primo \u00e8 il commento di riga, si usa per aggiungere una piccola descrizione. Per creare un commento di questo tipo baster\u00e0 anteporre \/\/ alla riga sulla quale \u00e8 scritto il commento, come mostrato nell&#8217;esempio:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n\/\/questo \u00e8 un commento\r\n\r\nint main (int argc, char **argv)\r\n<\/pre>\n<p>Il secondo \u00e8 detto commento multiriga e viene usato per aggiungere i commenti pi\u00f9 lunghi.<\/p>\n<p>Per inserire un commento multiriga bisogner\u00e0 racchiudere il testo tra i caratteri &#8221; \/* &#8221; e &#8221; *\/ &#8221; come in questo esempio:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n\/* il metodo sottostante serve solo\r\n\r\n  a dare una giustificazione a questo commento\r\n\r\n*\/\r\n\r\nint main(int argc, char **argv) {\r\n\r\n}\r\n<\/pre>\n<h4>La struttura del codice<\/h4>\n<p>Un programma in C \u00e8 composto da uno o pi\u00f9 blocchi di codice, il blocco principale si chiama main ed \u00e8 necessario che in ogni programma ve ne sia uno e uno solo. I blocchi di codice (quindi anche il main) hanno la seguente struttura:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nvalore_di_ritorno NOME_BLOCCO (parametri)\r\n\r\n{\r\n\r\n        operazioni nel blocco ;\r\n\r\n        operazioni nel blocco ;\r\n\r\n        ...\r\n\r\n        return VALORE ;\r\n\r\n}\r\n<\/pre>\n<p>Anche se in questo momento tutto ci pu\u00f2 sembrare poco chiaro possiamo notare alcuni aspetti:<\/p>\n<ul>\n<li>Il contenuto del blocco \u00e8 racchiuso dentro una coppia di parentesi graffe<\/li>\n<li>Ciascuna riga all&#8217;interno del blocco termina con un punto e virgola.<\/li>\n<li>Le istruzioni all&#8217;interno del blocco sono scritte pi\u00f9 a destra rispetto al nome del blocco.<\/li>\n<\/ul>\n<p>Bene, abbiamo appena imparato le prime due regole sintattiche del linguaggio C e una regola di indentazione! Le parentesi graffe sono utilizzate per delimitare il contenuto di un blocco,  indicando chiaramente il suo inizio e la sua fine, i punti e virgola servono a delimitare chiaramente ogni singola istruzione mentre l&#8217;indentazione verso destra serve ad agevolare la comprensione del codice nel caso di blocchi annidati uno dentro l&#8217;altro come in questo caso:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nvalore_di_ritorno NOME_BLOCCO (parametri)\r\n\r\n{\r\n\r\n        valore_di_ritorno NOME_BLOCCO (parametri)\r\n\r\n{\r\n\r\n                operazioni nel blocco ;\r\n\r\n                operazioni nel blocco ;\r\n\r\n                ...\r\n\r\n                return VALORE ;\r\n\r\n}\r\n\r\noperazioni nel blocco ;\r\n\r\n        operazioni nel blocco ;\r\n\r\n        ...\r\n\r\n        return VALORE ;\r\n\r\n}\r\n<\/pre>\n<p>Il codice cos\u00ec indentato risulta molto pi\u00f9 leggibile rispetto alla sua versione non indentata:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nvalore_di_ritorno NOME_BLOCCO (parametri)\r\n\r\n{\r\n\r\nvalore_di_ritorno NOME_BLOCCO (parametri)\r\n\r\n{\r\n\r\noperazioni nel blocco ;\r\n\r\noperazioni nel blocco ;\r\n\r\n...\r\n\r\nreturn VALORE ;\r\n\r\n}\r\n\r\noperazioni nel blocco ;\r\n\r\noperazioni nel blocco ;\r\n\r\n...\r\n\r\nreturn VALORE ;\r\n\r\n}\r\n<\/pre>\n<p>Un blocco di codice \u00e8 formalmente una funzione, che presi in input alcuni parametri, dopo aver effettuato alcune operazioni, fornisce un valore in output. In questo caso non stiamo parlando di funzione strettamente matematica, perch\u00e8 i valori in input e in output possono non essere sempre numeri, pensiamo ad una funzione che presi in input i dati come nome, cognome etc, restituisca in input il codice fiscale, oppure una funzione che presi in input i dati di un dipendente mi restiuisca l&#8217;importo della sua busta paga&#8230;<\/p>\n<p>Se confrontiamo lo schema con il blocco main dell&#8217;esempio del capitolo precedente possiamo vedere subito come la struttura sia identica (ho utilizzato i colori per evidenziare le componenti del blocco):<\/p>\n<p><center><\/p>\n<table border=\"0\">\n<tbody>\n<tr>\n<td><span style=\"color: #ff6600;\">int<\/span> <span style=\"color: #008000;\">main<\/span> (<span style=\"color: #0000ff;\">int argc, char **argv<\/span>)<\/p>\n<p>{<\/p>\n<p><span style=\"color: #800000;\">printf(&#8220;Questo \u00e8 il mio primo programma&#8221;);<\/span><\/p>\n<p><span style=\"color: #666699;\">return 0;<\/span><\/p>\n<p>}<\/td>\n<td><span style=\"color: #ff6600;\">valore_ritornato<\/span> <span style=\"color: #008000;\">NOME_BLOCCO<\/span> (<span style=\"color: #0000ff;\">parametri<\/span>)<\/p>\n<p>{<\/p>\n<p><span style=\"color: #800000;\">operazioni nel blocco ;<\/span><\/p>\n<p><span style=\"color: #800000;\">operazioni nel blocco ;<\/span><\/p>\n<p><span style=\"color: #800000;\">&#8230;<\/span><\/p>\n<p><span style=\"color: #666699;\">return VALOREl;<\/span><\/p>\n<p>}<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/center><\/p>\n<p>Esaminando il codice, adesso che sappiamo che un blocco \u00e8 a tutti gli effetti una funzione, possiamo quindi dire che:<\/p>\n<ul>\n<li>La funzione si chiama main<\/li>\n<li>La funzione accetta &#8220;quacosa&#8221; in input, vedremo poi meglio cosa.<\/li>\n<li>Che il valore_ritornato \u00e8 un int che sta per intero ovvero numero senza virgola<\/li>\n<li>Esegue una operazione in cui scrive la stringa &#8220;Questo \u00e8 il mio primo programma&#8221;<\/li>\n<li>Resituisce il valore zero.<\/li>\n<\/ul>\n<p>Secondo questo schema allora come potrebbe essere scritto un blocco di codice o, pi\u00f9 formalmente, una funzione, per sommare due numeri? Per esempio in questo modo:<\/p>\n<pre>\r\n<span style=\"color: #ff6600;\">int<\/span> <span style=\"color: #008000;\">somma_due_numeri<\/span>(<span style=\"color: #0000ff;\">int numeroA, int numeroB<\/span>) {\r\n\r\n      <span style=\"color: #800000;\">int risultato  =  numeroA +   numeroB;<\/span>        \r\n\r\n      return risultato;\r\n\r\n}\r\n<\/pre>\n<p>Seguendo l&#8217;esempio precedente possiamo analizzare questa funzione dicendo che:<\/p>\n<ul>\n<li>La funzione si chiama somma_due_numeri<\/li>\n<li>La funzione accetta &#8220;qualcosa&#8221; in input, che a guardare bene in questo caso sembrano due int, quindi due numeri senza virgola<\/li>\n<li>Restituisce in output un numero senza virgola<\/li>\n<li>Esegue una operazione in cui somma i due numeri ricevuti in input<\/li>\n<li>Resituisce il valore appena calcolato<\/li>\n<\/ul>\n<p>Bene, abbiamo scritto il nostro secondo programma in C!<\/p>\n<p>Adesso che siamo bravi proviamo ad analizzare queste funzioni, io non dar\u00f2 alcun suggerimento:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nint et\u00e0(int annoNascita)\r\n\r\n{\r\n\r\n        int risultato  =  2011 - annoNascita;\r\n\r\n        return risultato;\r\n\r\n}\r\n\r\nint duratadelmese (char *nomeMese) {\r\n\r\n        if nomeMese = gennaio\r\n\r\nreturn 31;\r\n\r\n        if nomeMese = febbraio\r\n\r\nreturn 28 ;\r\n\r\n        if nomeMese = marzo\r\n\r\nreturn 31;\r\n\r\n        ...\r\n\r\n}\r\n\r\nint secondiInUnaSettimana()\r\n\r\n{\r\n\r\n        return (60 * 60 * 24 * 7);\r\n\r\n}\r\n<\/pre>\n<p><strong>Nota:<\/strong> Se avete gi\u00e0 seguito qualche corso di programmazione C vi sarete accorti che questa lezione \u00e8 stata leggermente atipica, perch\u00e8 nel 99% dei casi i corsi iniziano parlando di altri argomenti e tralasciando interamente la struttura generale di un programma C. Sebbene questo sia lo standard defacto a mio avviso non \u00e8 il modo migliore per approcciarsi al C, spero quindi di aver fornito un approccio nuovo e piacevole al linguaggio.<\/p>\n<h4>Prossimamente<\/h4>\n<p>Nella prossima lezione inizieremo a parlare di variabili: cosa sono, come si dichiarano nel codice e come si usano. Non mancate perch\u00e8 inizieremo a fare sul serio!<\/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>In questa lezione inizieremo ad analizzare la sintassi del linguaggio C, quali sono le regole alle quali&#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":[656,655,593,588,241,637,638,653,654],"class_list":["post-6462","post","type-post","status-publish","format-standard","hentry","category-corso-completo-di-c","tag-blocchi-in-c","tag-commenti-in-c","tag-corso-completo-di-c-2","tag-corso-di-c","tag-ignazio-calo","tag-programmare-c-mac","tag-programmazione-c-windows","tag-sintassi-c","tag-struttura-di-un-programma-c"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6462","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=6462"}],"version-history":[{"count":10,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6462\/revisions"}],"predecessor-version":[{"id":7809,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6462\/revisions\/7809"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=6462"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=6462"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=6462"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}