Università dell’Insubria
Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese
Corso di Laurea in Informatica
Anno Accademico 2004/05
Laboratorio di Linguaggi
lezione IX
Marco Tarini
Espressioni e operatori
operatori su numeri
-
+
>>
*
/
%
-
&
|
+
<<
!=
==
>=
<=
>
<
binari
unari
operatori relazionali
operatori logici (booleani)
!=
==
||
&&
Marco Tarini ‧ Laboratorio di Linguaggi ‧
!
2004/05 ‧ Università dell’Insubria
Operatori Logici
• In C la semantica degli operatori logici e' lazy
if ((x<5)&&(fscanf(f,"-%c",&c)) ) {
...
}
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Assegnamenti
• Assegnamento base
=
<left value> = <expr>
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Left values: oggetti dotati di indirizzo
• Cosa e’ un “left value”
–
–
–
–
una variabile
una espressione di tipo puntatore... deferenziata
un elemento di un vettore
un campo di una variabile di tipo struct
• Non sono left values:
– qualunque altra espressione
– (costanti, risultati di operazioni, etc)
• Test mentale:
– posso metterla a sinistra di un assegnamento?
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Left values: oggetti dotati di indirizzo
• Esempi:
const int N=5;
int v[15];
int x,y;
int * p;
Persona r;
– quali sono left values?
v[3]
p
x
*((&x)+2)
v[3+x]
*p
x/5
r
5
N
&x
r.nome
v[x]+3
*(p+10)
(*p) + 10
r.eta + 5
5+x
&p
&x + 2
x + y
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Left values:
• Solo un left-value puo' :
– essere usato a sx di un assegnamento
– subire l’operatore &
– subire operatori di modifica
• che mutano il valore
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Operatori unari di modifica
operatori su numeri
-
+
*
>>
<<
/
%
-
&
|
+
%=relazionali
*=operatori
/=
operatori di modifica
(scorciatoie sintattiche)
>>=
<<=
&= |=
<
!=
==
>=
<=
>
+=
binari
unari
-=
x+=3;
operatori
!= x>>=1;
==
x=x+3;
logici (booleani)
||
&& x = x >>
! 1;
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Operatori unari di modifica
• incremento - decremento
l'espressione vale il valore non ancora incrementato / decrementato
("prima usa il valore, poi incrementa / decrementa la variabile")
x++
x--
++x
--x
l'espressione vale il valore già incrementato / decrementato
("prima incrementa / decrementa la variabile, poi usa il valore ")
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Assegnamenti
• Assegnamento base
=
<left value> = <expr>
tipo T0
tipo T1
typecast automatico se T0 diverso da T1
(ma solo se esiste una conversione automatica).
Ma e' sempre meglio (piu' chiaro) usare un typecast esplicito!
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Assegnamenti
• Assegnamento base
x = y = z = 10;
=
expr di tipo T0
<left value> = <expr>
tipo T0
tipo T1
typecast automatico se T0 diverso da T1
(ma solo se esiste una conversione automatica).
Ma e' sempre meglio (piu' chiaro) usare un typecast esplicito!
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Esercizio
• Non esiste il tipo bool
• Come si puo’ fare ad aggiungerlo?
– in modo che sia possibile scrivere, per esempio:
Bool b;
int x;
Bool b0,b1,b2 = TRUE;
int main(){
b = ( x == 0);
if (b) {
...
};
b = !b;
}
int main(){
...
b0 = b1 && b2;
while (b0) {
...
}
}
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Esercizio: alcune soluzioni
• soluzione 1:
typedef enum {FALSE, TRUE} Bool;
• soluzione 2:
typedef int Bool;
const Bool TRUE = 1;
const Bool FALSE = 0;
• soluzione 3:
#define Bool int
#define TRUE 1
#define FALSE 0
Bool b;
int x;
int main(){
b = ( x == 0);
if (b) {
...
};
b = !b;
}
Marco Tarini ‧ Laboratorio
Bool b0,b1,b2 = TRUE;
int main(){
...
b0 = b1 && b2;
while (b0) {
...
}
}
di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
E' gia' una micro-libreria !
file "bool.h"
typedef
enum {FALSE, TRUE} Bool;
#include "bool.h"
#include "bool.h"
Bool b;
int x;
Bool b0,b1,b2 = TRUE;
int main(){
b = ( x == 0);
if (b) {
...
};
b = !b;
}
int main(){
...
b0 = b1 && b2;
while (b0) {
...
}
}
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Inclusione files
Due sintassi diverse per "includere" un file
#include "bool.h"
"inserisci un file
che fa parte di questo
progetto"
(il file verrà cercato nella
directory corrente)
#include <bool.h>
"inserisci una
una libreria esterna"
(il file verrà cercato nelle
apposite
"directories di libreria")
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Inclusione files
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Diamo una occhiata
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Definizioni e dichiarazioni
tipo del risultato: intero
(output della funzione)
corpo della
funzione
“cosa fa”
un blocco
delimitato
da {}
nome
(identificatore)
della funzione:
“potenza”
lista dei parametri formali,
ciascuno preceduto dal tipo
(input della funzione)
int potenza (int b, int e)
{
int res=1 , i;
for (i=1; i<=e; i++) {
res = res * b;
}
return res;
}
variabili locali
• qui, due
• visibili solo
nel corpo
della
funzione.
• dichiarate
all’inizio!
comando “return”:
restituzione del
risultato, e uscita dalla
funzione
ci deve essere!
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Definizioni e dichiarazioni
dichiarazione della funzione
int potenza (int b, int e);
o prototipo della funzione
- "tutto quello che serve sapere
per usare la funzione
(a scatola chiusa)"
int potenza (int b, int e)
{
int res=1 , i;
for (i=1; i<=e; i++) {
res = res * b;
}
return res;
}
Marco Tarini ‧ Laboratorio di Linguaggi ‧
definizione della funzione
o implementazione della
funzione
- "le istruzioni dettagliate per
eseguire la funzione"
2004/05 ‧ Università dell’Insubria
Definizioni e dichiarazioni
• Esempio
int potenza (int b, int e)
{
int res=1 , i;
for (i=1; i<=e; i++) {
res = res * b;
}
return res;
}
int main(){
int x;
x = potenza(5, 6);
}
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Definizioni e dichiarazioni
• Esempio: invertiamo l'ordine per capriccio
int main(){
int x;
x = potenza(5, 6);
}
errore in
compilazione:
identificatore
sconosciuto:
"potenza"
int potenza (int b, int e)
{
int res=1 , i;
for (i=1; i<=e; i++) {
res = res * b;
}
return res;
}
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Definizioni e dichiarazioni
• Esempio
(i nomi dei parametri formali si
possono anche omettere)
int potenza (int b , int e );
int main(){
int x;
x = potenza(5, 6);
}
int potenza (int b, int e)
{
int res=1 , i;
for (i=1; i<=e; i++) {
res = res * b;
}
return res;
}
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Progetti a piu' files
• Schema
file "potenze.h"
int potenza(int b,int e);
file "main.c"
#include "potenze.h"
int main(){
int x;
x = potenza(5, 6);
}
Marco Tarini ‧ Laboratorio di Linguaggi ‧
file "potenze.c"
#include "potenze.h"
int potenza(int b,int e)
{
int res=1 , i;
for (i=1; i<=e; i++) {
res = res * b;
}
return res;
}
2004/05 ‧ Università dell’Insubria
Struttura della compilazione
main.c
preprocess.
file
precomp. compiler
1
object
file
main.o
potenze.h
prepotenze.c process.
linker
file
precomp. compiler
3
Marco Tarini ‧ Laboratorio di Linguaggi ‧
eseguibile
finale
exec.exe
object
file
potenze.o
2004/05 ‧ Università dell’Insubria
Con DevC++
• Tasto destro sul progetto
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Con DevC++
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Con DevC++
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Con DevC++
Ripentendo per potenza.h si ottiene:
nota: "compile" VS "build" (anche: "make")
Marco Tarini ‧ Laboratorio di Linguaggi ‧
2004/05 ‧ Università dell’Insubria
Scarica

lucidi