Copertina
Autore Brian W. Kernighan
CoautoreDennis M. Ritchie
Titolo Linguaggio C
EdizioneJackson, Milano, 1980 , Isbn 978-88-7056-211-8
LettoreRenato di Stefano, 1988
Classe informatica: linguaggi
PrimaPagina


per l'acquisto su IBS.IT

per l'acquisto su BOL.IT

per l'acquisto su AMAZON.IT

 

| << |  <  |  >  | >> |

Indice

INTRODUZIONE ALL'EDIZIONE ITALIANA      IX
PREFAZIONE                              XI

Capitolo 0 - INTRODUZIONE                1


Capitolo 1 - UN'INTRODUZIONE DIDATTICA   5

1.1   Per cominciare                     5
1.2   Variabili e Aritmetica             8
1.3   L'istruzione for                  11
1.4   Costanti simboliche               12
1.5   Una raccolta di programmi utili   13
1.6   Arrays                            20
1.7   Funzioni                          22
1.8   Argomenti - Chiamata per Valore   23
1.9   Array di caratteri                24
1.10  Visibilità; Variabili Esterne     27
1.11  Sommario                          30

Capitolo 2 - TIPI, OPERATORI ED
             ESPRESSIONI                31

2.1   Nomi di variabili                 31
2.2   Tipi e dimensioni dei dati        31
2.3   Le costanti                       32
2.4   Le dichiarazioni                  34
2.5   Operatori Aritmetici              35
2.6   Operatori Relazionali e Logici    36
2.7   Conversioni di Tipo               37
2.8   Operatori di Incremento
            e Decremento                40
2.9   Operatori Logici orientati al Bit 42
2.10  Operatori ed Espressioni
            di Assegnamento             44
2.11  Espressioni Condizionali          45
2.12  Priorità e Ordine di valutazione  46

Capitolo 3 - STRUTTURE DI CONTROLLO     49

3.1   Istruzioni e Blocchi              49
3.2   If - Else                         49
3.3   Else - if                         51
3.4   Switch                            52
3.5   Loops - While e For               53
3.6   Loops - Do-while                  56
3.7   Break                             57
3.8   Continue                          58
3.9   Goto e Label                      59

Capitolo 4 - FUNZIONI E STRUTTURA
             DEI PROGRAMMI              61

4.1   Fondamenti                        61
4.2   Funzioni che non ritornano interi 64
4.3   Ulteriori precisazioni sugli
            argomenti di funzione       66
4.4   Variabili Esterne                 67
4.5   Regole di Visibilità              71
4.6   Variabili static                  74
4.7   Variabili Register                75
4.8   Struttura a Blocchi               76
4.9   lnizializzazione                  77
4.10  Ricorsione                        79
4.11  Il Preprocessor C                 80

Capitolo 5 - PUNTATORI ED ARRAY         83

5.1   Puntatori e Indirizzi             83
5.2   Puntatori e Argomenti di Funzioni 85
5.3   Puntatori ed Array                87
5.4   Aritmetica sugli Indirizzi        90
5.5   Puntatori a caratteri e Funzioni  93
5.6   I Puntatori non sono Interi       96
5.7   Array Multi-dimensionali          97
5.8   Array di Puntatori; Puntatori
            a Puntatori                 98
5.9   lnizializzazione degli array
            di Puntatori               101
5.10  Confronto tra Puntatori e
            Array Multi-dimensionali   102
5.11  Argomenti sulla linea di comando 103
5.12  Puntatori a Funzioni             107

Capitolo 6 - STRUTTURE                 111

6.1   Fondamenti                       111
6.2   Strutture e funzioni             113
6.3   Arrays di strutture              115
6.4   Puntatori alle strutture         119
6.5   Strutture ricorsivi              121
6.6   Ricerca tabellare                125
6.7   Campi                            127
6.8   Unioni                           129
6.9   Typedef                          130

Capitolo 7 - INPUT ED OUTPUT           133

7.1   Accesso alla Libreria Standard   133
7.2   Standard lnput ed Output -
            Getchar e Putchar          134
7.3   Output Formattato - Printf       135
7.4   lnput Formattato - Scanf         137
7.5   Conversione di Formati
            di Memoria                 139
7.6   Accesso a File                   140
7.7   Gestione degli Errori -
            Stderr e Exit              143
7.8   Input e Output di Linea          144
7.9   Altre Funzioni                   145

Capitolo 8 - L'INTERFACCIA CON
             IL SISTEMA UNIX           147

8.1   Descrittori di file              147
8.2   1/0 a basso livello -
            Read e Write               148
8.3   Open, Creat, Close, Unlink       150
8.4   Accesso Random - Seek e Lseek    151
8.5   Esempio - Un'implementazione
            di Fopen e Getc            152
8.6   Esempio - Lista di Directory     156
8.7   Esempio - Un allocatore
            di memoria                 159

Appendice A - MANUALE DI RIFERIMENTO
              DEL C                    165

1.    Introduzione                     165
2.    Convenzioni Lessicali            165
2.1   Commenti                         165
2.2   Identificatori (Nomi)            165
2.3   Parole Chiave                    166
2.4   Costanti                         166
2.4.1 Costanti Intere                  166
2.4.2 Costanti long esplicite          166
2.4.3 Costanti Carattere               166
2.4.4 Costanti Floating                167
2.5   Stringhe                         167
2.6   Caratteristiche Hardware         167
3.    Notazione Sintattica             167
4.    Cosa c'è in un nome?             168
5.    Oggetti e lvalue                 169
6.    Conversioni                      169
6.1   Caratteri ed interi              169
6.2   Float e double                   169
6.3   Floating e integral              169
6.4   Puntatori e interi               170
6.5   Unsigned                         170
6.6   Conversioni aritmetiche          170
7.    Espressioni                      170
7.1   Espressioni primarie             171
7.2   Operatori unari                  173
7.3   Operatori moltiplicativi         174
7.4   Operatori additivi               174
7.5   Operatori di shift               175
7.6   Operatori relazionali            175
7.7   Operatori di eguaglianza         175
7.8   Operatore AND sui bit            176
7.9   Operatore OR esclusivo sui bit   176
7.10  Operatore OR inclusivo sui bit   176
7.11  Operatore AND logico             176
7.12  Operatore OR logico              177
7.13  Operatore condizionale           177
7.14  Operatori di assegnamento        177
7.15  Operatore virgola                178
8.    Dichiarazioni                    178
8.1   Specifiche di classe di memoria  179
8.2   Specifiche di tipo               179
8.3   Dichiaratori                     180
8.4   Significato dei dichiaratori     180
8.5   Dichiarazione di strutture
            e unioni                   182
8.6   Inizializzazione                 184
8.7   Nomi di tipo                     186
8.8   Typedef                          187
9.    Istruzioni                       187
9.1   Istruzione espressione           187
9.2   Istruzioni composte o blocco     188
9.3   Istruzione condizionale          188
9.4   Istruzione while                 188
9.5   Istruzione do                    188
9.6   Istruzione for                   189
9.7   Istruzione switch                189
9.8   Istruzione break                 190
9.9   Istruzione continue              190
9.10  Istruzione return                190
9.11  Istruzione goto                  190
9.12  Istruzione con label             191
9.13  Istruzione nulla                 191
10.   Definizioni esterne              191
10.1  Definizioni di funzioni esterne  191
10.2  Definizioni di dati esterni      192
11.   Regole di visibilità             192
11.1  Visibilità lessicale             193
11.2  Visibilità delle esterne         193
12.   Linee di controllo del
            compilatore                194
12.1  Rimpiazzamento di simboli        194
12.2  Inclusione di file               195
12.3  Compilazione condizionale        195
12.4  Controllo di linea               195
13.   Dichiarazioni implicite          196
14.   Analisi dei tipi                 196
14.1  Strutture e unioni               196
14.2  Funzioni                         196
14.3  Array, puntatori ed
            indicizzazione             197
14.4  Conversione esplicita
            di puntatori               197
15.   Espressioni costanti             198
16.   Considerazioni di portabilità    199
17.   Anacronismi                      200
18.   Sommario Sintattico              200
18.1  Espressioni                      200
18.2  Dichiarazioni                    202
18.3  Istruzioni                       203
18.4  Definizioni esterne              204
18.5  Preprocessore                    204
 

 

| << |  <  |  >  | >> |

Pagina 1

CAPITOLO 0
INTRODUZIONE


Il C è un linguaggio di programmazione di applicazione generale. E' stato sempre messo in stretta relazione a UNIX in quanto è stato sviluppato su questo sistema operativo, e poiché UNIX stesso ed il suo software sono scritti in C. Tuttavia il linguaggio non è legato ad alcun sistema operativo o macchina e, nonostante sia stato considerato come un "linguaggio di programmazione di sistema" per la sua utilità nella scrittura di sistemi operativi, è stato usato altrettanto bene per scrivere grossi programmi numerici, di text processing e data-bases.

Il C è un linguaggio relativamente a "basso livello". Questa non è certo una caratteristica negativa; significa semplicemente che il C ha a che fare con lo stesso tipo di oggetti trattati dalla maggior parte dei computers come caratteri, numeri ed indirizzi. Questi possono essere combinati e trasferiti attraverso gli operatori logici ed aritmetici implementati dalle macchine attuali.

Il C non dispone di operazioni per trattare direttamente oggetti strutturati come stringhe di caratteri, insiemi, liste ed array considerati come un'unità. Non esistono, ad esempio, operazioni analoghe a quelle dei PL/1 che manipolano interi array o stringhe. Il linguaggio non definisce altre possibilità di allocazione di memoria che la definizione statica e la gestione a stack fornita dalle variabili locali delle funzioni: non ci sono meccanismi di heap o "garage collection" come quelli dell'Algol 68. Infine il C in sé stesso non possiede funzioni di input-output: non ci sono istruzioni READ e WRITE, né sono predisposti metodi di accesso ai files. Tutti questi meccanismi di livello più alto devono essere supportati da funzioni chiamate esplicitamente.

Allo stesso modo, il C offre solo lineari costrutti di controllo: test, cicli, raggruppamenti e sottoprogrammi, ma non la multiprogrammazione, operazioni parallele, sincronizzazione e co-routines.

Sebbene l'assenza di alcune di queste caratteristiche possa sembrare una grave mancanza ("Vuoi dire che devo chiamare una funzione per confrontare due stringhe di caratteri?"), il fatto di aver contenuto il linguaggio in dimensioni modeste ha portato vantaggi reali. Poiché il C è relativamente piccolo, può essere descritto in uno spazio limitato ed imparato rapidamente. Un compilatore per il C può essere semplice e compatto. I compilatori stessi vengono scritti velocemente; usando la tecnologia dei nostri giorni, è probabile che si produca un compilatore per una nuova macchina in un paio di mesi, scoprendo che l'80% dei codice dei nuovo compilatore è comune a quelli già esistenti. Ciò produce un alto valore di mobilità del linguaggio. Poiché i tipi di dati e le strutture di controllo fornite dal C sono direttamente supportate dalla maggior parte dei computer esistenti, la libreria richiesta in esecuzione per implementare programmi a se stanti, risulta piccola. Sul PDP/11, per esempio, contiene solamente le routine per ottenere la moltiplicazione e la divisione in 32 bit e per gestire le sequenze di entrata e uscita dalle subroutine. Naturalmente, ogni implementazione provvede a dare una comprensibile e compatibile libreria di funzioni per isolare l'i/O, la gestione delle stringhe e le operazioni di allocazione di memoria, ma poiché vengono chiamate solo esplicitamente, possono essere evitate se opportuno; anch'esse possono essere scritte portabilmente in C.

Poiché il linguaggio riflette le prestazioni dei computer attuali, i programmi C tendono ad essere abbastanza efficienti da non avere l'esigenza di essere riscritti in linguaggio assembier. Il più ovvio esempio è il sistema operativo UNIX stesso, scritto quasi interamente in C. Su 13000 linee di codice di sistema, solo appena 800 linee al livello più basso sono in assembier. Inoltre, praticamente tutti i programmi applicativi di UNIX sono scritti in C; la stragrande maggioranza degli utenti UNIX (compreso uno degli autori di questo libro) non conoscono neanche l'assembier dei PDP-1l.

| << |  <  |  >  | >> |

Pagina 83

CAPITOLO 5
PUNTATORI ED ARRAY


Un puntatore è una variabile che contiene l'indirizzo di un'altra variabile. I puntatori sono molto usati in C, in parte perché rappresentano talvolta l'unica maniera per esprimere un calcolo, ed in parte perché generalmente portano ad un codice più compatto ed efficiente di quanto possa essere ottenuto con altri procedimenti.

I puntatori, assieme all'istruzione "goto", sono stati considerati una maniera meravigliosa per creare programmi impossibili da capire. Questo è certamente vero quando vengono usati senza un preciso motivo, e diventa facile creare puntatori che puntano dove non ci si aspetterebbe. Con criterio, comunque, i puntatori possono essere usati per ottenere chiarezza e semplicità. Questo è l'aspetto che tenteremo di illustrare.

| << |  <  |  >  | >> |

Pagina 111

CAPITOLO 6
STRUTTURE


Una struttura è un insieme di una o più variabili, eventualmente di tipo diverso, raggruppate sotto un unico nome per consentirne un trattamento più comodo. (Le strutture sono chiamate "records" in alcuni linguaggi, tra i quali ricordiamo il Pascal).

Un tipico esempio di struttura è la registrazione delle paghe: un impiegato viene descritto da un insieme di attributi come il nome, l'indirizzo, il numero di previdenza sociale, lo stipendio, ecc. Alcuni di essi potrebbero a loro volta essere strutture: un nome ha diverse componenti, come ne hanno un indirizzo ed anche uno stipendio.

Le strutture aiutano ad organizzare dati complessi, particolarmente in grossi programmi, poiché in molte situazioni permettono di trattare un gruppo di variabili in relazione tra di loro come un'unità e non come entità separate. In questo capitolo cercheremo di illustrare come vengono usate le strutture. I programmi che useremo sono più lunghi di molti altri nel libro, ma rimagono di dimensioni modeste.

| << |  <  |