Il linguaggio di programmazione C

Caratteristiche generali
Il C è un linguaggio: semplice (~30 keywords)
strutturato
procedurale
tipizzato
Basso livello (vicino all’architettura del sistema)
Grande flessibilità (adatto anche a grandi progetti)

...un linguaggio strutturato

...un linguaggio procedurale

Formattazione del listato
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, “ , ‘ , …. )

Un programma compilabile
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

“Hello World!” At least!

Le variabili

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:

Esempio ciclo for
#include <stdio.h>
int main() {
  int i;
  for(i=0;i<10;i++)
  {
  printf("Hello !\n");
  printf(“Lab III !\n");
  }
  return 0;
}

Esempio ciclo while
#include <stdio.h>
int main() {
  int i = 0;
  while(i <10)
  {
  printf("Hello !\n");
  printf(“Lab III !\n");
  i = i +1;
  }
  return 0;
}

Esempio ciclo do-while
#include <stdio.h>
int main() {
  int i = 0;
  do {
    printf("Hello !\n");
    printf(“Lab III !\n");
    i = i +1;
     }  while(i <10)
  return 0;
}

Esempio di uso di for (II)

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:

Esempio if-else if-else

Operatori (1/5)
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;

Operatori (2/5)
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 (3/5)
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

Operatori (4/5)
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 (5/5)
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)

Due operatori speciali
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 );

Vettori
Dichiarazione

Vettori: immagazzinamento in memoria
I vettori sono memorizzati in locazioni di memoria consecutive
L’indice del primo elemento è 0

Esempio uso di vettori

Le librerie standard
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>

Per saperne di più
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)