Tipi di dato primitivi (oltre int) Tipi di dato primitivi int (già trattati) Valori logici (ricordati) Valori reali Valori carattere Informatica - A.A. 2009/2010 - Tipi di dato 2 1
Valori logici (il caso particolare del C) In molti altri linguaggi di programmazione i valori logici hanno un loro tipo predefinito (spesso bool o boolean). Nel linguaggio gg C, al contrario, non esiste un tipo logico come tipo a sé stante! Pertanto, si sfrutta il tipo int : - il valore 0 (zero) indica FALSO - ogni valore diverso da 0 indica VERO (per convenzione, talvolta, si usa 1 per denotare vero, ma bisogna ricordare che non è così per tutti i compilatori) Vengono considerati falsi anche: 0 '\0 (fine stringa) 0.0 5-5 EOF (end of file) Vengono invece considerati veri : 5 A 2.35 3*2 Informatica - A.A. 2009/2010 - Tipi di dato 3 Operatori logici operatore logico operatore C not (negazione) unario! and binario && or binario In C, non esistendo il tipo boolean, gli operatori logici operano su interi e restituiscono i un intero: il valore 0 viene considerato falso ogni valore diverso da 0 viene considerato vero il risultato è 0 o 1 Esempi 5 && 7 0 33!5 Informatica - A.A. 2009/2010 - Tipi di dato 4 2
Tabella di verità degli operatori AND Ris. OR Ris. NOT Ris. 1 && 1 1 1 && 0 0 0 && 1 0 0 && 0 0 1 1 1 1 0 1 0 1 1 0 0 0!1 0!0 1 Informatica - A.A. 2009/2010 - Tipi di dato 5 Valutazione in corto-circuito Gli operatori logici && e sono valutati in cortocircuito: la valutazione dell espressione logica termina appena si è in grado di determinare il risultato I termini successivi sono valutati solo se necessario Esempi 22 x L espressione è già vera in partenza (22 è vero) 0 && x L espressione è già falsa in partenza (0 è falso) Espressioni i condizionali i composte: a && b && c a b c Se a && b è falso, il secondo && non viene valutato Se a b è vero, il secondo non viene valutato Informatica - A.A. 2009/2010 - Tipi di dato 6 3
Espressioni condizionali (operatore?) condizione? espr1 : espr2 Il valore risultante è o quello di espr1, o quello di espr2: dipende dal valore dell espressione condizione: se condizione denota vero (un valore zero), si usa espr1 se condizione denota falso (il valore zero), si usa espr2 Esempi 3? 10 : 20 x? 10 : 20 (x>y)? x : y denota sempre 10 denota 10 se x è diversa da 0, se no 20 denota il maggiore fra x e y Informatica - A.A. 2009/2010 - Tipi di dato 7 Tipi di dato primitivi int (già trattati) Valori logici (ricordati) Valori reali Valori carattere Informatica - A.A. 2009/2010 - Tipi di dato 8 4
Numeri Reali Esistono due modi per rappresentare un numero reale: 1. Virgola fissa Pes P.es., 0.00150015 314 3.14 123.2727 52. 2. Virgola mobile Mantissa Esponente base 10 Separate dal simbolo e P.es., il numero 1853.0000059 può essere rappresentato come: 185300.00059e-2 185300.00059*10-2 18530000059e-7 0.0018530000059e+6 0.118530000059e+4 (notazione standard) Informatica - A.A. 2009/2010 - Tipi di dato 9 Numeri Reali (cont.) Il numero di cifre disponibili per rappresentare un numero all interno del computer è limitato, per cui si potrebbero verificare approssimazioni (troncamenti o arrotondamenti) nella rappresentazione di numeri reali con molte cifre. Esempio Il numero 277290.0010044 se si avessero massimo 10 cifre a disposizione potrebbe essere rappresentato come 0.277290001e+6 Tuttavia, questa rappresentazione trasformerebbe il numero originario 277290.0010044 277290.001 In molte applicazioni questa approssimazione non costituisce un problema, ma in altre applicazioni, come ad esempio quelle di calcolo scientifico, costituisce una seria fonte di errori. Informatica - A.A. 2009/2010 - Tipi di dato 10 5
Tipi float e double Mirano a rappresentare (con diversa precisione) ) l insieme dei numeri REALI In realtà (così come per int per INTERI), sono solo un approssimazione dei numeri reali, sia come precisione sia come intervallo di valori rappresentabili Informatica - A.A. 2009/2010 - Tipi di dato 11 STANDARD Tipi float e double (cont.) float 4b byte double 8 byte long double 10 byte Tipo Precisione Valori float 6 cifre decimali 3.4^10-38... 3.4 ^ 10+38 double 15 cifre decimali 1.7 ^ 10-308... 1.7 ^ 10+308 Informatica - A.A. 2009/2010 - Tipi di dato 12 6
Operatori su float e double = Assegnamento + Addizione * Moltiplicazione / Divisione reale (è diversa dalla divisione tra interi) == Attenzione: se x e y sono float o double, invece di scrivere: if (x == y) è meglio scrivere if ((x<y + 0.000001) && (x>y - 0.000001))!= Diverso (not equal) < Minore > Maggiore <= Minore o uguale >= Maggiore o uguale Informatica - A.A. 2009/2010 - Tipi di dato 13 Attenzione! A causa della rappresentazione su di un numero finito di cifre, ci possono essere errori dovuti al troncamento o all arrotondamento di alcune cifre decimali Meglio evitare l uso dell operatore == in quanto i test di uguaglianza tra valori reali (in teoria uguali) potrebbero non essere verificati. Ovvero, non sempre vale: (x / y) *y == x Meglio utilizzare "un margine accettabile di errore": (x == y) (x < y+epsilon) && (x > y-epsilon) dove, ad esempio, const float epsilon=0.000001 Informatica - A.A. 2009/2010 - Tipi di dato 14 7
Operatori su float e double Operatori aritmetici Risultato + - * / float o double Operatori relazionali ==!= int < > <= >= int Esempi 5. / 2 = 2.5 2.1 / 2 = 1.05 7.1 > 4.55 = 1 o intero diverso da 0 RICORDARE CHE: 5. / 2 = 2.5 ; 5/ 2. = 2.5 ; mentre 5 / 2 = 2 Informatica - A.A. 2009/2010 - Tipi di dato 15 Tipi di dato primitivi int (già trattati) Valori logici (ricordati) Valori reali Valori carattere Informatica - A.A. 2009/2010 - Tipi di dato 16 8
Tipo Carattere: char Rappresenta l insieme dei caratteri disponibili sul sistema. a b A 2 @ L insieme dei caratteri è ordinato L ordine dipende dalla codifica adottata Generalmente, si utilizza il codice ASCII La codifica nella forma estesa utilizza 1 byte per cui vi sono 256 valori rappresentabili, da 0 a 255 Vi è anche la forma ristretta su 7 bit, per cui l insieme di valori rappresentabili si riduce a 128, da 0 a 127 Informatica - A.A. 2009/2010 - Tipi di dato 17 Tabella dei codici ASCII 000 001 010 011 100 101 110 111 0000 NUL DLE 0 @ P p 0001 SOH DC1! 1 A Q a q 0010 STX DC2 2 B R b r 0011 ETX DC3 # 3 C S c s 0100 EOT DC4 $ 4 D T d t 0101 ENQ NAK % 5 E U e u 0110 ACK SYN & 6 F V f v 0111 BEL ETB 7 G W g w 1000 BS CAN ( 8 H X h x 1001 HT EM ) 9 I Y i y 1010 LF SUB * : J Z j z 1011 VT ESC + ; K [ k { 1100 FF FS, < L \ l 1101 CR GS - = M ] m } 1110 SO RS. > N ^ n ~ 1111 SI US /? O _ o DEL Informatica - A.A. 2009/2010 - Funzioni 18 9
Tipo char Nel linguaggio C (a differenza di altri linguaggi) il tipo char non denota un nuovo tipo, ma è equivalente al dominio dei valori interi rappresentati su di un byte (range 0-255) Codifica ASCII estesa Poiché i char sono codificati come interi su di un byte valgono gli stessi operatori degli int Nelle operazioni, bisogna inoltre considerare che le tabelle ASCII dei caratteri occidentali rispettano il seguente ordinamento (detto lessicografico): 0 < 1 < 2 < < 9 < < A < B < C < < Z < < a < b < c < < z < 9 < < A < B < C < < Z < < b < Vale la regola di prossimità all interno di ciascuna di queste tre classi ovvero, il carattere successivo di a è b, di B è C, di 4 è 5, ecc. Tuttavia, le tre classi (minuscole, maiuscole, numeri) non sono contigue! Informatica - A.A. 2009/2010 - Tipi di dato 19 Tipo char (cont.) Tipo Dimensione Valori char 1 byte -127.. 128 unsigned char 1 byte 0.. 255 Sono quindi applicabili tutti gli operatori visti per gli int. Pertanto, si può scrivere: x / A equivale a 120 / 65 uguale a: 1 R < A equivale a 82 < 65 uguale a: 0 x 4 equivale a 120 52 uguale a: 68 (= D ) x 4 equivale a 120 4 uguale a: 116 (= t ) Informatica - A.A. 2009/2010 - Tipi di dato 20 10
Dove si sbaglia frequentemente Operazioni matematiche e tipi di dato Divisione fra interi e divisione fra reali (stesso simbolo /, ma differente significato) Significato e uso dell operazione di modulo (%) Operatore di assegnamento (=) e operatore di uguaglianza (==) Notazione prefissa e postfissa di ++ e - -negli assegnamenti Informatica - A.A. 2009/2010 - Tipi di dato 21 Altre regole (più complesse) Priorità e associatività degli operatori Espressioni eterogenee Assegnamenti eterogenei Informatica - A.A. 2009/2010 - Tipi di dato 22 11
Regole di priorità e associatività Priorità e associatività degli operatori PRIORITA : specifica l ordine di valutazione degli operatori quando in una espressione compaiono operatori diversi P.es., 3+10*20 è letta come 3+(10 * 20) perché in C l operatore * è prioritario rispetto a + NB: operatori diversi possono comunque avere uguale priorità (per esempio, + e -, * e / e %) ASSOCIATIVITA : precisa l ordine di valutazione quando in un espressione compaiono operatori con la medesima priorità associatività a sinistra valutazione da sinistra a destra associatività a destra valutazione da destra a sinistra P.es., 30-10 + 8 è letta come (30 10) + 8, perché gli operatori + e sono equiprioritari, e sono entrambi associativi a sinistra Informatica - A.A. 2009/2010 - Tipi di dato 24 12
Priorità e associatività degli operatori (cont.) Le espressioni aritmetiche vengono valutate in base alle regole di priorità degli operatori. (Si utilizzano le regole tradizionali dell aritmetica) P.es., a=2, b=4, c=6, a+b*c a+(b*c) = 26 Associatività e priorità possono venire alterate mediante l uso di parentesi: a+b*c =26 (a+b)*c =36 a-b+c = 4 a-(b+c) = -8 2-3+4*7%2+3 = 2 2-3+4*(7%(2+3)) = 7 Informatica - A.A. 2009/2010 - Tipi di dato 25 Regole di priorità degli operatori (cont.) Gli operatori relazionali hanno priorità inferiore agli operatori aritmetici k<b+3 equivale a k<(b+3) e non a (k<b) +3 Esempio: Cosa contengono le variabili logico1 e logico2 al termine dell esecuzione del seguente programma? main() { float x, y; int a,b; int logico1, logico2 ; x=10.5; y=3.6; a=2; b=1; logico1=x<(y*0.5); /* logico1 = 10.5<1.8 == 0 == FALSE */ logico2=a!=b; /* logico2 = 2!=1 == 1 == TRUE */ } Informatica - A.A. 2009/2010 - Tipi di dato 26 13
Sintesi priorità degli operatori! - ++ -- * / % > >= < <= ==!= &&? : = (Gli operatori sulla stessa riga hanno stessa priorità, quindi la priorità è da sinistra a destra) Informatica - A.A. 2009/2010 - Tipi di dato 27 Associatività dell assegnamento L operatore di assegnamento può comparire più volte in un istruzione. L associatività dell operatore di assegnamento è a destra Es., k = j = 5; equivale a j = 5; k = j; k = j+2 = 5; NON SI PUO FARE! Informatica - A.A. 2009/2010 - Tipi di dato 28 14