Il linguaggio di programmazione C
Il C è un linguaggio: semplice (~30 keywords) | |
strutturato | |
procedurale | |
tipizzato | |
Basso livello (vicino all’architettura del sistema) | |
Grande flessibilità (adatto anche a grandi progetti) |
Il C è “case sensitive”: MyFunction ¹ myfunction | ||
La formattazione è libera MA | ||
gli spazi possono essere inseriti SOLO tra un “token” e l’altro! | ||
è necessario almeno uno spazio tra due tokens che non siano delimitatori ( parentesi, “ , ‘ , …. ) |
Le parentesi graffe { … } racchiudono
un gruppo di istruzioni da trattare come una singola azione: es.: corpo di una funzione, corpo di un ciclo, ecc.. |
|
Il punto e virgola chiude tutte le istruzioni |
I tipi numerici del linguaggio C
Dichiarazioni e “scopo” delle variabili
Esempio sull’uso delle variabili
Le istruzioni di controllo (1/3)
Istruzioni di ciclo: |
#include <stdio.h> | |
int main() { | |
int i; | |
for(i=0;i<10;i++) | |
{ | |
printf("Hello !\n"); | |
printf(“Lab III !\n"); | |
} | |
return 0; | |
} |
#include <stdio.h> | |
int main() { | |
int i = 0; | |
while(i <10) | |
{ | |
printf("Hello !\n"); | |
printf(“Lab III !\n"); | |
i = i +1; | |
} | |
return 0; | |
} |
#include <stdio.h> | |
int main() { | |
int i = 0; | |
do { | |
printf("Hello !\n"); | |
printf(“Lab III !\n"); | |
i = i +1; | |
} while(i <10) | |
return 0; | |
} |
Le istruzioni di controllo (2/3)
Maggior controllo sui cicli: istruzioni di salto | ||
istruzione break;: causa l’immediata uscita dal più interno dei cicli in cui si trova |
||
istruzione continue;: causa l’esecuzione immediata dell’istruzione di chiusura del ciclo, cui segue l’iterazione successiva del ciclo |
||
istruzione goto label;: salto incondizionato all’etichetta label:; consente l’uscita da molti cicli annidati |
||
istruzione return espr_opz; esce dalla funzione corrente ritornando opzionalmente il valore di espr_opz |
Le istruzioni di controllo (3/3)
Istruzioni di scelta: |
Assegnamento: operatore = | ||
lvalue = espr; | ||
significato: valuta l’espressione espr assegna espr ad lvalue ritorna espr |
||
è associativo da destra a sinistra | ||
per assegnare il valore 10 alle variabili a e b, si può scrivere: a = b = 10; |
Tra tipi numerici: | ||
moltiplicazione e divisione: *, / | ||
modulo: % (es.: 20 % 9 fa 2) | ||
addizione sottrazione: +, - | ||
Non esiste un operatore di elevamento a potenza | ||
Booleiani | ||
Equivalenza (e non) di espressioni logiche: ==, != | ||
AND tra espressioni logiche: && | ||
OR tra espressioni logiche: || | ||
NOT di espressione logica: ! |
Operatori di manipolazione dei bit: | |||
AND bit a bit: & | |||
OR ed XOR bit a bit: |, ^ | |||
spostamento a sinistra e a destra: <<, >> | |||
es.:
a: 1000000010101101 a << 2: 10 0000001010110100 |
|||
NOT bit a bit (complemento a 1): ~ | |||
Operatori relazionali: | |||
minore e maggiore: <, > | |||
minore o uguale, maggiore o uguale : <=, >= |
Esempio uso operatori bit a bit
Espressioni di assegnamento in forma compatta: | ||
a = (a + b); si può anche scrivere | ||
a += b; | ||
L’operatore += si comporta come un
operatore di assegnamento, e quindi ritorna il valore assegnato, es.: c += a += b + 1; significa a = a + (b + 1); c = (c + a); |
||
Analogamente abbiamo: | ||
-=, *=, /=, %=, &=, ^=,|=, <<=, >>= |
Operatori di incremento e decremento: | ||
notazione prefissa: | ||
++a; incrementa a e ritorna il nuovo valore | ||
--a; decrementa a e ritorna il nuovo valore | ||
notazione postfissa: | ||
a++; ritorna a e, dopo, lo incrementa | ||
a--; ritorna a e, dopo, lo decrementa | ||
Possono essere applicati a tutti i tipi interi (e ai puntatori) |
casting: | |||
( type ) espr; forza l’espressione espr ad essere interpretata come fosse di tipo type es.: |
|||
double f; f = ( double ) 10; |
|||
sizeof: | |||
ritorna la dimensione in bytes di un tipo | |||
unsigned int size; size = sizeof( float ); |
Dichiarazione |
Vettori: immagazzinamento in memoria
I vettori sono memorizzati in locazioni di memoria consecutive | ||
L’indice del primo elemento è 0 |
Tutte le istruzioni del linguaggio C sono di basso livello. | ||
Le operazioni complesse (compreso l’I/O !) sono effettuate dalle funzioni delle “librerie standard” (abbiamo visto ad es.: printf(…)) | ||
Le librerie più comunemente usate sono: | ||
Input e output: <stdio.h> | ||
Manipolazione stringhe: <string.h> | ||
Funzioni matematiche: <math.h> | ||
Gestione della memoria ed altre utilità: <stdlib.h> |
Testo sacro: | ||
B.W. Kernighan, D.M. Ritchie: The C programming language |
||
Altri libri: | ||
I. Pohl: A Book on C | ||
M. Waite, S. Prata: New C Primer Plus (2nd. Ed.) | ||
Materiale su www: | ||
T. Love: ANSI C for Programmers on UNIX Systems |
||
(http://www.nd.edu/~cchen/teaching_C/node3.html) |