Sei sulla pagina 1di 11

C: primi elementi

Lezione 4

• Evoluzione del BCPL (1967) e B (1970), entrambi “typeless”


• Sviluppato da Dennis Ritchie nel 1972 ed implementato per il PDP-11
• Usato per lo sviluppo del sistema operativo UNIX
• Molti sistemi operativi sono stati scritti in C
• Standardizzazione nel 1990 (ANSI C)

• Approfondimenti e curiosità:
• http://cm.bell-labs.com/cm/cs/who/dmr/chist.html

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi
• Un programma C è composto da un insieme di funzioni
• Una funzione C può essere considerata per certi aspetti analoga alla nozione
elementare di funzione matematica

• Esempio


• f(x,y)=x+y (definizione della funzione “somma”)
• f(3,4)=7 (uso della funzione con argomenti 3 e 4)

• Anche le funzioni C calcolano e restituiscono un valore a partire dai valori


specifici degli argomenti… con la seguente generalizzazione: una funzione C
può non avere argomenti e/o può non restituire alcun risultato (… restituisce un
risultato “nullo” o void)
• Per default (ossia se non diversamente specificato) il valore restituito da una
funzione è un numero intero

• Anche una funzione C deve essere prima definita e poi usata

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi

• In C esistono due tipologie di funzioni:

• Le funzioni definite nella libreria standard che possono quindi essere


usate in un programma (vedere appendice B del libro)
• Le funzioni definite dal programmatore

• Definire una funzione vuol dire scrivere le istruzioni che indicano “cosa
fare” per calcolare il risultato

• Un programma C deve contenere sempre una funzione speciale, detta


main che indica dove inizia il programma
• Il main generalmente non ha argomenti…
• …Il più piccolo programma in C! : main ( ) { }

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi
• Le istruzioni relative ad una funzione sono eseguite (il valore da
restituire è calcolato) quando la funzione viene attivata

• La funzione main è attivata “dall’esterno” (dal sistema operativo, ossia


quando un utente “lancia” o esegue l’intero programma) ed il valore
viene restituito al sistema operativo per indicare se il programma è
terminato con successo (valore 0) o meno

• Le altre funzioni sono attivate “dall’interno” del programma, mediante


un’istruzione di chiamata di funzione

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi

#include <stdio.h>
/*Il mio primo programma in C*/
int main ( )
{
printf("Ciao mondo\n");
return 0;
}

Questo programma stampa sullo schermo

Ciao mondo
# # è la posizione del cursore
Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi
#include <stdio.h>

- Direttiva per il preprocessore.

- Il preprocessore sostituisce il contenuto del file stdio.h alla direttiva include


esattamente nel punto dove essa appare. Il file contiene le dichiarazioni delle
funzioni per l’ingresso e l’uscita

- Una dichiarazione stabilisce come deve essere usata la funzione, in termini di


numero e tipo di argomenti e tipo del valore restituito (vedi dopo per la nozione
di tipo)
- Il linker unirà poi il codice delle funzioni di libreria al codice generato dal
compilatore a partire dal sorgente

- /*Il mio primo programma in C*/

- Commento. Viene ignorato dal compilatore

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi

int main ( ) { … }

- Le parentesi tonde indicano che si tratta di una funzione

- Ogni funzione riceve un insieme di argomenti, indicati nelle parentesi tonde, e


restituisce un valore
In questo caso main non ha argomenti
int specifica che main restituirà al termine dell’esecuzione un valore intero (int)
se non inserito si assume che il valore restituito sia int

- Le istruzioni eseguite dalla funzione sono quelle incluse all’interno della coppia
di parentesi graffe { }. Tale insieme si chiama corpo della funzione

- Il C è case sensitive (Main non è uguale a main)

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi
printf("Ciao mondo\n");

- E’ un’istruzione semplice
- Ogni istruzione semplice termina con un punto e virgola
- Si tratta di una chiamata (o attivazione) della funzione printf con
parametro “Ciao mondo \n”
- Tale sequenza di caratteri racchiusi della coppia di apici e’ una stringa
di caratteri
- Il carattere \ (backslash) è il carattere di escape (fuga). Esso indica che
i caratteri che seguono hanno un significato speciale
\n : (new line) andata a capo

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi

return 0;

- Indica il valore da restituire a “chi” ha attivato la funzione main (il


sistema operativo)
- Provoca la terminazione del programma
- Può essere omessa. In questo caso l’esecuzione del man termina
quando incontra la parentesi quadra chiusa }

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi
#include <stdio.h> Direttiva inclusione
/*Il mio primo programma in C*/ Commento

int main ( ) definizione funzione main


{ inizio blocco funzione main
printf("Ciao mondo\n"); istruzione
return 0; valore restituito al termine dell’esecuzione
} fine blocco funzione main

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi

• Le variabili sono un’astrazione del concetto di cella di memoria


• Una variabile è caratterizzata (principalmente) da:

• nome logico (deve iniziare con una lettera o “underscore” _ e non deve
essere una parola chiave!)

• valore

• tipo. Specifica le proprietà della variabile, in termini di valori che può


assumere e di operazioni ammissibili sulla variabile. Il tipo consente di
verificare in fase di compilazione la correttezza dell’uso della variabile

• Prima di essere usata una variabile deve essere dichiarata


• Una variabile assume un valore a seguito di un’istruzione di assegnamento

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi
• La forma generale (sintassi) di un assegnamento è
<variabile>=<espressione>
• Il significato è: “valuta il valore di <espressione> e poni il risultato nella
cella di memoria individuata dall’ indirizzo di <variabilie>”
• L’indirizzo di una variabile definisce il suo l-value
• Il valore della variabile definisce il suo r-value

• Il termine <espressione> può essere:


– Un’ espressione semplice
• Una costante
• il valore di una variabile (r-value)
• Il valore restituito da una funzione
– Un’espressione composta
• Composizione di espressioni mediante operatori
• Anche = è un operatore… l’operatore di assegnamento
• x=y=6

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi

Prima Dopo

x x=3 x
? 3

x x = x+3 x
3 6

x y x = x+y
x y
3 3 6 3

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi
Operazione Operatore C Esempio

Inversione segno - -15

Somma + 12+2
12.0 + 2
Differenza - 12 - 4
14.5 - 4
Divisione / 7/2 (=3)
7.0/2 (=3.5)
Modulo (resto) % 7%3

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi

#include <stdio.h>
main() {
int base,altezza;/*dichiarzione di base ed altezza*/
base=10;
altezza=12;
printf("%d",base*altezza);
}

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi
#include <stdio.h>
main() {
int base=10; /*dichiarazione ed inizializzazione di base*/
int altezza=12; /*dichiarazione ed inizializzazione di altezza*/
printf("%d",base*altezza);
}

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi

#include <stdio.h>
main() {
int base=10, altezza=12; /*dichiarazione ed inizializzazione di base, altezza*/
printf("%d",base*altezza);
}

Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi
• Le operazioni di lettura si riferiscono implicitamente ad un dispositivo
logico, stdin (lo standard input). Normalmente allo stdin è associata la
tastiera
• Le operazioni di scrittura si riferiscono implicitamente ad un dispositivo
logico, stout (lo standard output). Normalmente allo stdout è associato il
video
• Gli errori sono scritti su un dispositivo logico detto stderr (standard error).
Normalmente allo stderr è associato il video

stdin programma stdout

stderr
Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi

direttiva di inclusione #include <stdio.h>


funzione main main () {
dichiarazioni delle variabili a,b,somma int a,b,somma;

Istruzione semplice di scrittura printf("Inserisci il primo numero:\n");


Istruzione di lettura da stdin scanf("%d",&a);

printf("Inserisci il secondo numero:\n");


scanf("%d",&b);

Istruzione di assegnameto somma = a+b;


istruzione di scrittura printf("La somma vale: %d", somma);
ritorno al chiamante return 0;
}
Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi
scanf (“%d”,&a)

“%d”: stringa di controllo del formato. Indica il tipo di dato da leggere (%d è la
specifica di conversione per intero)
la lettura avviene dallo stdin
& : operatore address-of

Esempio:
La variabile a corrisponde alla locazione di memoria con indirizzo 0x1000
&a è pari a 1000
Il valore letto dallo stdin è memorizzato nella locazione 0x1000
….

0x1000
memoria

…..
Fondamenti di Informatica, Ingegneria Elettronica, Università “La Sapienza” Roma. aa 02-03. R. Beraldi