3 Linguaggioc

94
INFORMATICA Il linguaggio C

Transcript of 3 Linguaggioc

  • 1. INFORMATICA Il linguaggio C

2. Premessa

  • Fu creato agli inizi degli anni 70 quale strumento per lo sviluppo del Sistema Operativo UNIX.
  • Si diffuso molto rapidamente e nel 1989 lAmerican National Standards Institute (ANSI) completava la definizione del linguaggio producendo il documento noto comeANSI C , al quale fanno riferimento ormai tutti i compilatori per quel linguaggio.
  • A differenza degli altri linguaggi ad alto livello consente un agevole accesso alla struttura hardware del sistema di elaborazione.

3. Caratteristiche Generali

  • Il C un linguaggio:
    • ad alto livello
      • ... ma anche poco astratto
    • strutturato
      • ... ma con eccezioni
    • fortemente tipizzato
      • ogni oggetto ha un tipo
    • semplice(!?)
      • poche keyword
    • case sensitive
      • maiuscolo diverso da minuscolo negli identificatori!
    • portabile
    • standardizzato (ANSI)

4. Alfabeto

  • Ilvocabolariobase del C costituito dai seguenti simboli:
  • tutte le lettere dellalfabeto inglese maiuscole e minuscole:
  • AZ,az
  • le dieci cifre decimali
  • 0 9
  • un insieme di caratteri speciali, tra cui:
  • +*/= < > ( ) [ ] { } . , ; : ? ! % # &

5. Identificatori

  • Si riferiscono ad una delle entit del linguaggio:
    • costanti
    • variabili
    • funzioni
    • ecc.
  • Iniziano con un carattere alfabetico oppure con _ (underscore)e possono contenere solamente caratteri alfabetici, cifre e _
  • Il C standard prevede che solo i primi 31 caratteri dell'identificatore sono significativi, anche se possono essere usati nomi pi lunghi.

6. Commenti

  • Sono testi liberi inseriti allinterno del programma dal programmatore per descrivere cosa fa il programma.
  • Non sono processati dal compilatore: servono al programmatore, non al sistema!
  • Formato:
    • Racchiuso tra i simboli:/**/
    • Non possibile annidarli.
  • Esempi:
    • /* Questo un commento corretto! */
    • /* Questo /*risulter un*/errore */

7. Istruzioni

  • Le istruzionidevono essere scritte rispettando alcune regole sintattichee di punteggiatura.
  • Listruzione deve sempre essere conclusa con un;(punto e virgola).
  • Si pu scrivere pi di unistruzione per rigapurch ognuna sia conclusa col; .
  • Unistruzione pu occupare pi di una riga .

8. Parole chiave

  • Riservate!
  • Nel C standard sono 32 :
  • auto double int struct
  • break else long switch
  • case enum register typedef
  • char extern return union
  • c onst float short unsigned
  • continue for signed void
  • default goto sizeof volatile
  • do if static while

9. Struttura di un programma C

  • Struttura generale:
      • Direttive e parte dichiarativaglobale
      • main ()
      • {
      • Parte dichiarativalocale
      • Parte esecutiva
      • }

10. Struttura di un programma C

  • Tutti gli oggetti, con le loro caratteristiche, che compongono il programma devono essere preventivamentedichiarati .
  • main
    • la parola chiave che indica il punto di ingresso del programma quando viene eseguito dal S.O.;
    • il suo contenuto delimitato da parentesi graffe{ }

11. Struttura di un programma C

  • Parte dichiarativalocale :
    • elenco degli oggetti che compongono ilmain ognuno con le proprie caratteristiche.
  • Parte esecutiva:
    • sequenza di istruzioni , ovvero ci che descriviamo con il diagramma di flusso oppure con lo pseudocodice! Ovvero le istruzioni vere e proprie!

12. Struttura di un programma C

  • Programma minimo:
      • main()
      • {
      • }

fileprova.c START STOP 13. I dati 14. Definizione dei dati

  • In C, tutti i dati devono esseredichiarati e definiti prima di essere usati!
  • Definizione di un dato :
    • riserva spazio in memoria;
    • assegna un nome.
    • identifica gli operatori leciti su quel dato
  • Richiede lindicazione di:
    • nome(identificatore);
    • tipo ;
    • modalit di accesso(variabile/costante).

15. Tipi

  • Il tipo definisce l'insieme deivaloriche possono essere assunti, larappresentazione internae l'insieme deglioperatoriche possono agire su quel dato.
  • Il linguaggio C richiede di definire il tipo dei dati e possiede regole rigide per la loro manipolazione ( tipizzazione forte). Permette inoltre al programmatore di definire nuovi tipi astratti.
  • Contemporaneamente permette di vedere gli oggetti interni al calcolatore: i registri, la memoria, gli indirizzi (puntatori), ecc.

16. Tipi base (primitivi)

  • Sono quelli forniti direttamente dal C.
  • Sono identificati da parole chiave!
    • char caratteri ASCII;
    • int interi (complemento a 2);
    • float reali (floating point singola precisione);
    • double reali (floating point doppia precisione).
  • La dimensione precisa di questi tipi dipende dallarchitettura (non definita dal linguaggio).
    • char= 8 bit sempre
  • Attenzione:le parole chiave dei tipi base vanno scritte in minuscolo!

17. INFORMATICA Cenni sulla Rappresentazione dei dati 18. char

  • Il tipochar(character)definisce un carattere (attenzione:un solo carattere !) espresso su 8 bit (1 byte) in codice ASCII.
  • I valori sono interpretati comenumeri interi con segno su 8 bit(-128 +127).
  • Un carattere deve essere indicato tra apici, cos:
  • a

19. int

  • Il tipoint(integer)definisce i numeri interi con segno.
  • La rappresentazione interna e l'intervallo dei valori assunti dipende dal compilatore e dalla macchina usata.
  • Generalmente si tratta del complemento a 2 e i valori assunti sono compresi nellintervallo -3276832767 su 16 bit oppure, per le macchine a 32 bit, nellintervallo-2.147.483.6482.147.483.647.
  • Vanno indicati semplicemente cos come siamo abituati a scriverli sulla carta, col loro valore (senza il punto decimale):
  • -2453

20. float e double

  • Sia iltipofloatche il tipodoublesono rappresentazioni di numeri reali (frazionari).
  • Sono rappresentati secondo la notazionefloating-point , rispettivamente in singola (32 bit) e doppia (64 bit) precisione.
  • I valori assunti (rappresentabili) sono:
  • float 3.4E+38(7 cifre decimali)
  • double 1.7E+308(17 cifre decimali)
  • La rappresentazione normalmente riferita allo standard IEEE P754.

21. float e double

  • I valori di tipofloatodoublevanno indicati con il punto decimale, ad esempio:
  • 14.8743
  • E ammessa anche una notazione simile alla notazione scientifica con il carattere E al posto di 10, cos:
  • 0.148743E-02
  • In alternativa, si pu ancora scrivere il numero senza punto decimalema seguito dal suffissoFoppuref(ad esempio,10F ,10fe10.0sono equivalenti). Il compilatore concepisce questi valori sempre come di tipodouble .

22. Modificatori dei tipi base

  • Sono previsti dei modificatori, identificati da parole chiave, da premettere ai tipi base:
  • short
  • long
  • signed
  • unsigned

23. short / long

  • Il qualificatoreshortsi applica al tipointe impone che la rappresentazione degli interi sia su 16 bit (valori assunti: -3276832767);
  • il qualificatorelongsi applica sia al tipointche al tipodouble ;
    • long intimpone la rappresentazione degli interi su 32 bit (valori assunti: -2.147.483.6482.147.483.647);
    • long doubleforza la rappresentazione dei reali su 80 bit ( 1.7E+308 aumentando la precisione a 22 cifre decimali).

24. signed / unsigned

  • I qualificatorisignedeunsigned si applicano ai tipichareint .
  • signed ridondante e serve solo a ricordare che un valore inteso con segno (ma perintechar gi cos!);
  • unsignedpermette di estendere l'intervallo dei valori non-negativi.
    • Il tipounsigned char pu assumere valori nell'intervallo 0255 e il tipo unsigned int valori nell'intervallo 065535.
  • I qualificatori possono apparire da soli: nel qual caso si assume che sia sottinteso il tipoint . E lecito, ad esempio, il tipounsigned shortche viene interpretato comeunsigned short int , ecc.

25. Altri valori interi

  • Per un dato intero, i valori di variabili e costanti possono anche essere espressi inesadecimale(specificati col prefisso0xoppure0X , ad esempio,0xFF = 255 10 ) oppureottale(prefisso0(zero), ad esempio0377 = 255 10 );
  • per il formatolongsi usa il suffissoLoppurel( 255Lo255lesprimono entrambi unlong intcon valore255 10 );
  • per l' unsignedsi usa il suffissoUoppureu( 255Ue255uesprimono ununsigned int=255 10). I suffissiuedlpossono apparire entrambi, con ovvio significato.

26. Valori speciali

  • Il codice ASCII comprende alcuni caratteri non stampabili. Per rappresentarli viene utilizzata lasequenza di escape( backslashseguito da un altro carattere).

tabulatore vert. v null tabulatore orizz. esadecimale x ddd return ottaleddd new line backslash pagina nuova f doppio apice backspace apostrofo allarme a Carattere Sequenza Carattere Sequenza 27. Tabella riassuntiva 1.7E 308 (16 cifre) double 1.7E 308 (20 cifre) long double 3.4E 38 (7 cifre)float 0 4.294.967.295 unsigned long, unsigned long int 0 65535 unsigned int, unsigned short int 0 255 unsigned, unsigned char, unsigned short 2.147.483.6482.147.483.648 signed long, signed long int 2.147.483.6482.147.483.648 long, long int, -3276832.767signed short, signed short int -3276832.767short, short int,signed short-3276832.767int, signed ,signed int-128 127char, signed char Intervallo dei valori Tipo 28. Direttive

  • Il C prevede che nel programma, oltre alle istruzioni,possano esserci anche delledirettiveche devono essere interpretate ed eseguite dal compilatore stesso (inserzione di macro, compilazioni condizionate, inclusione di altri sorgenti, ecc.);
  • il compilatore C esegue una preelaborazione del programma, dettaPreprocessing , per riconoscere ed eventualmente eseguire le direttive ;
  • ledirettivesi distinguono dalle istruzioni perch sono inserite sempre in righe individuali e iniziano con il carattere#seguito da una parola chiave; ad esempio:
  • #include
  • #define

29. Definizione di variabili

  • Sintassi:
  • < tipo >< nome della variabile>;
  • Pi in generale (definizioni multiple):
  • < tipo >< lista dei nomi delle variabil i>;
    • < nome >: lidentificatore che rappresenta il nome della variabile;
    • < lista dei nomi delle variabili>: lista di identificatori separati da,(virgola).

30. Definizione di variabili

  • Esempi:
    • int x;
    • char ch;
    • long int x1 ,x2, x3;
    • double pi;
    • short int stipendio;
    • long y,z;
  • Usiamo nomi significativi!
    • Esempi: int RitenuteOperate, StipendioBase;
    • float OreLavorate;
  • Esempi errati:
  • float Ore Lavorate ;/* c uno spazio*/
  • int Stip?base;/* c un carattere speciale*/

31. Definizione di variabili

  • E possibile inizializzare una variabile, ovvero attribuirgli un valore prima che venga utilizzata per la prima volta, in fase di dichiarazione della stessa.
  • Esempio:
    • int x = 24;
    • char ch = m;
    • double pi = 124.654;

32. Definizione di costanti

  • Sintassi:
  • const< tipo >< nome della costante > = < valore >;
  • Esempi:
    • const double pigreco =3.14159;
    • const charseparatore = $;
    • const float aliquota = 0.2;
  • Convenzione:
    • Identificatori delle constanti tipicamente in MAIUSCOLO (ma una convenzione!).
      • const double PIGRECO = 3.14159;

33. La direttiva define

  • E un'altra possibilit di definire valoricostanti: si introduce un identificatore come sinonimo di una costante:
  • #define identificatoretesto
  • Deve comparire sempre in testa al programma, prima dimain() , e all'inizio della riga.
  • E elaborata dalpreprocessoredel compilatore, che sostituir in tutto il programma, ovunque appare l'identificatore, il testo di cui sinonimo.

34. La direttiva define

  • Non essendo un'istruzione non termina con il punto e virgola.
  • Esempi:
  • #definePIGRECO3.1415
  • #defineDOMENICA7
  • #defineVERO1
  • #defineCaratterep

35. Stringa

  • Definizione:
    • sequenza di caratteri terminata dal carattereNULL( );
  • non un tipo di base del C.
  • memorizzata in posizioni adiacenti di memoria.
  • Formato:
    • < sequenza di caratteri >
    • Esempi:
      • Ciao!
      • abcdefg

36. Visibilit delle variabili

  • Ogni variabile definita allinterno di un precisoambiente di visibilit (scope).
  • Variabiliglobali
    • definiteallesternoalmain sono visibili da tutti i moduli.
  • Variabililocali
    • definiteallinternodelmain(sono visibili solo allinterno delmain );
    • pi in generale, definite allinterno di un blocco (sono visibili solo allinterno del blocco).

37. Struttura a blocchi

  • In C possibile aggregare gruppi di istruzioni inblocchiracchiudendole tra parentesi graffe;
  • significato:delimitazione di un ambiente di visibilit di oggetti (variabili).
  • Esempio:
      • {
        • int a=2;
        • int b;
        • b=2*a;
      • }

aebsono definite solo allinterno del blocco! 38. Visibilit delle variabili - Esempio

    • n, x :visibili in tutto il file
    • a, b, c ,y :visibili in tutto il main
    • d, z :visibili solo nel blocco
    • int n;
    • double x;
    • main()
    • {
    • int a,b,c;
    • double y;
    • {
    • int d;
    • double z;
    • }
    • }

39. Le istruzioni 40. Assegnazioni

  • Sintassi:
    • < variabile > = < espressione > ;
  • Non unuguaglianza !
    • Significato:il risultato di < espressione > vieneassegnatoa < variabile >;
    • < variabile >e< espressione >d evono essere compatibili (ovvero dello stesso tipo);
    • < variabile >deve essere stata precedentemente definita!
  • Esempio:
      • int x;
      • float y;
      • x = 3;
      • y = -323.9498;

41. Assegnazioni

  • In realt l assegnazione(oassegnamento ) non unistruzione (come accade in tutti gli altri linguaggi);
  • il simbolo= unoperatoreche assegna alla variabile che si trova a sinistra il valore calcolato sullespressione di destra;
  • nel caso pi semplice lespressione di destra un semplice valore.
  • Sono pertanto lecite assegnazioni multiple:
  • < var 1 > = < var 2 > = < espressione > ;

42. Istruzioni di I/O

  • Per ora consideriamo solo lI/O interattivo, quello cio che si realizza con tastiera e monitor.
  • Sono disponibili diverse forme in base al tipo di informazione letta o scritta:
    • I/O formattato
    • I/O di caratteri
    • I/O per righe

43. I/O formattato

  • Standard output (scrittura su monitor)
    • istruzioneprintf
  • Standard input (lettura da tastiera)
    • istruzionescanf
  • Lutilizzo di queste funzioni richiede linserimento di unadirettiva
  • #include
  • allinizio del file sorgente il cui significato : includi il filestdio.h

44. Listruzioneprintf

  • Visualizza sul monitor.
  • Laprintfopera utilizzando una stringa, detta , nella quale si devono inserire i comandi che descrivono come devono apparire i dati sul monitor.
  • Aldeve seguire la lista di variabili che si vuol visualizzare.
  • Sintassi:
  • printf (< format >,< arg1 >,...,< argn >);

45. Listruzioneprintf

  • < format > : stringa che determina il formato di visualizzazione per ognuno dei vari argomenti.
  • < arg1 >,...,< argn > : lista degli argomenti da visualizzare.Gli argomenti (opzionali) possono essere costanti, variabili o espressioni.
  • Se non ci sono argomenti (come quando si vuole visualizzare solo un messaggio) la funzione trasferisce sul video il testo della stringa die il cursore si posiziona subito dopo l'ultimo carattere.

46. Listruzioneprintf

  • Affinch il cursore vada a capo, occorre inserire nella stringa diformatil carattere new-line ( ).
  • Esempio:
  • #include
  • main()
  • {
  • printf ("Stampa di una riga ");
  • printf ("Seconda riga ");
  • }

47. Specificatori di formato

  • Generalmente nelformatsono indicati gli specificatori di formato per le variabili della lista. I principali specificatori di formato sono:
    • %do%iper il tipoint , stampa in notazione decimale;
    • %o per il tipoint , stampa in ottalesenza segno;
    • %xper il tipoint , stampa in esadecimale senza segno;
    • %u per il tipoint , stampa in decimale senza segno;
    • %c per il tipochar , stampa un carattere;
    • %fper il tipofloat , stampa nella notazione virgola mobile nel formato -d.dddddd (6 cifre dopo la virgola);
    • %eo%Eper il tipofloat , stampa nella notazione virgola mobile nel formato esponenziale -d.dddddde(E)dd;
    • %sper le sequenze di caratteri (stringhe).

48. Specificatori di formato

  • Gli specificatori di formato sono costituiti dal carattere%seguito da un altro carattere che indica il formato da utilizzare per la stampa dell'argomento corrispondente (carattere, numero intero o reale, stringa, ecc.).
  • Quando incontra il primo specificatore di formato il C preleva il primo argomento, effettua la conversione dal formato interno del dato ad una sequenza di caratteri ASCII seguendo le indicazioni del descrittore ed esegue infine l'ouput dei caratteri sul video.
  • Prosegue poi con la stringa del format, ripetendo le azioni prima descritte per ogni specificatore incontrato e cos fino ad esaurire l'intero format: il numero di specificatori di formato deve essere quindi pari al numero di argomenti.

49. Esempio

  • Lassociazione tra variabili e specificatori di formato di tipo ordinale: 1 specificatore1 variabile;
  • 2 specificatore2 variabile, ecc.
  • Esempi:
  • int x = 2;
  • float z = 0.5;
  • char c = a;
  • printf (%d %f %c , x, z, c);
  • printf (%f***%c***%d , z, c, x);

2 0.500000 a _ 0.500000***a***2 _ 50. Specificatori di formato

  • Tra il carattere % e quello di specificazione pu esserci uno o pi elementi aggiuntivi:
    • un intero, che fissa la larghezza minima (numero di caratteri) del campo su cui il dato stampato;
    • un punto seguito da un intero, che stabilisce la precisione con cui visualizzare il dato (numero di cifre frazionarie);
    • uno di questi modificatori:
      • h (per indicare che si tratta di un tiposhort ),
      • l(per indicare che si tratta di un tipolong ),
      • L (per indicare che si tratta di un tipolong double ).

51. Esempio (printf)

  • #include
  • main()
  • {
  • inta=-57,b=2,c=450,d=33;
  • floate=1.22E7,f=-0.1234567, g=98765.4321,h=1.0;
  • printf ("a=%4d b=%3d c=%8d d=%1d ", a, b, c, d);
  • printf (e=%9.3f f=%9.3f g=%9.3f h=%9.3f", e, f, g, h);
  • }
  • Sul video apparir:
  • a= -57 b=2 c=450 d=33
  • e=12200000.000 f=-0.123 g=98765.432 h=1.00

52. Listruzione scanf

  • Permette la lettura di dati da tastiera.
  • Lascanf , come laprintf , opera utilizzando unformat , cio un descrittore del formato che devono avere i dati in ingresso e accetta vari tipi di argomenti: interi, reali, caratteri, stringhe, ecc.
  • Sintassi:
  • scanf (< format >,< arg1 >,...,< argn >);

53. Listruzione scanf

  • : una stringa di caratteri dove compaionosolo specificatori di formato( bene evitare di inserire degli spazi tra gli specificatori), gli stessi utilizzati per laprintf ;
  • ,...,:possono essere solo variabili il cui nome deve esserepreceduto dal carattere& .
    • ATTENZIONE!!! MPORTANTE
    • i nomi delle variabili vanno sempre precedute dalloperatore &
    • che indica lindirizzo della variabile
  • Esempio:
    • int x;float z;
    • scanf(%d%f, &x, &z);

54. Listruzione scanf

  • Per comprendere il funzionamento dellascanf si immagini che, man mano che vengono introdotti i caratteri dalla tastiera, il codice di ognuno venga accodato in un contenitore (unflusso ).
  • Si possono pensare cos a delle sequenze di caratteris ulle quali il programma in esecuzione dispone di uncursore .
  • Le modalit con cui opera lascanf sono alquanto complesse e dipendono dagli specificatori che compaiono nel .

55. Listruzione scanf

  • Quando deve leggere unnumero intero o reale ( int, float, double ) , il cursore avanza fino al primo carattere diverso daspazio .
  • Vengono poi letti tutti i caratteri successivi (cifre) fino a raggiungere un carattere dispaziooppure un delimitatore di riga (comunque un carattere non numerico), sul quale il cursore si ferma.
  • Se la sequenza di caratteri cos isolata corretta, viene convertita nella rappresentazione interna ( complemento a 2 oppure floating-point ) e il valore attribuito alla variabile, altrimenti le operazioni dellascanfsi bloccano.

56. Listruzione scanf

  • Nel caso che la stringa contenga pi di un descrittore, per ognuno viene attivato l'opportuno meccanismo di lettura e conversione: affinch lascanf si comporti correttamenteci devono essere tanti descrittori quanti argomenti.
  • Tra un numero e il successivo possono essere inseriti quanti caratteri separatori si desidera(spazio, new-line, ecc.):vengono automaticamente ignorati (come ce ne fosse uno solo!).
  • Se invece si leggono dati ditipochar viene letto un solo carattere, quellosu cui posizionato il cursore, il quale avanza di una sola posizione!

57. Listruzione scanf

  • Per i dati pi comuni (numeri e stringhe di caratteri) i valori devono essere introdotti separandoli tra loro da almeno un separatore (spazio, invio, ecc.).
  • Lo specificatore%* x provoca il salto della prossima conversione:viene effettuata la lettura ma il valore non viene assegnato all'argomento.
  • Lo specificatore%*pu risultare utile in pratica solo nel caso di lettura di dati da file (come si vedr pi avanti).

58. Esempio

  • #include
  • int dato1, dato2, dato3;
  • main()
  • {
  • printf( Introduci tre numeri interi: ");
  • scanf("%d%d%d", &dato1, &dato2, &dato3);
  • printf( Hai introdotto: dato1=%d, dato2=%d,
  • dato3=%d, dato1, dato2, dato3);
  • }

59. Listruzione scanf

  • I tre dati interi (da tastiera) possono essere introdotti indifferentemente separandoli tra loro con un semplicespaziooppure con il tasto diinviooppure ancora con il caratteretab,ecc.
  • Ad esempio sono leciti ed equivalenti:
    • 14 674 99000(su una sola riga)
    • 674 99000(su una sola riga)
    • 14
    • 674 (su tre righe distinte)
    • 99000

60. I/O

  • scanfeprintfnon sono le uniche possibilit che abbiamo per introdurre o visualizzare dati.
  • Esistono numerose altre istruzioni di input sia per la lettura da tastiera, sia per leggere dati da altri periferici (come, ad es., il disco).
  • Sono naturalmente diponibili le rispettive istruzioni di output.
  • Il loro uso per pi complesso e verr proposto pi avanti.

61. Espressioni

  • Sono c ombinazioni di variabili e operatori.
  • Esistono varie categorie di operatori, applicabili a tipi di dati diversi:
    • operatori aritmetici;
    • operatori relazionali;
    • operatori logici;
    • operatori sui bit:
    • ecc.

62. Operatori aritmetici

  • Quattro operatori comuni a tutti (numeri reali e interi):
  • + - * /
  • Per i numeri interi, esiste anche loperatore%che ritorna il resto della divisione intera.
  • Stesse regole di precedenza dellaritmetica ordinaria:
    • ( *,/ )>( + ,- )
    • le parentesi tonde alterano la gerarchia.
  • Esempio:
    • int x = 5,y = 2,q,r;
    • q = x / y;/*(q = 2, variabili intere! troncamento)*/
    • r =x % y;/*(r = 1) , resto di 5 / 2*/
    • q = x + (y * (x r));/*5 + (2 * (5 1)) = 13*/

63. Operatori aritmetici: esempi

  • main()
  • {
  • const double ENEPER = 2.718281;
  • /*sezione variabili*/
  • int dato, divintero;
  • double risul, inizio;
  • dato = 12 * 3 - 4 * 5;/*equivale a (12*3)-(4*5) = 16*/
  • dato = dato + 1; /*aggiunge 1 a dato: dato = 17*/
  • divintero = dato % 10; /*resto di 17 / 10 (= 7)*/
  • inizio = dato;/*conversione di tipo*/
  • risul = inizio / ENEPER;/*divisione tra numeri reali*/
  • }

64. Conversione forzata di tipo (casting)

  • Si pu forzare la conversione di tipo anteponendo al dato che si vuole convertire il tipo posto tra parentesi, secondo questo schema:
  • (tipo) espressione
  • Esempio:
  • int dato_1, dato_2;
  • float dato_real, media;
  • ..
  • dato_real = (float)dato_1 / (float)dato_2;
  • media = (dato_1 + dato_2) / (float)2;
  • L'effetto della conversione mediante l'operazionecast limitato all'espressione in cui appare: il dato su cui opera resta immutato.

65. Operatori di assegnamento composti

  • E possibile combinare listruzione di assegnazione con gli operatori aritmetici.
  • Sintassi:
    • < variabile >< operatore > = < espressione > ;
  • Operatori:
    • +=-=*=/=%=
    • Significato: assegnazione + operazione.
  • Esempi:
    • x+= 5; /*equivalente a x = x + 5*/
    • y-= x; /*equivalente a y = y x*/

66. Operatori di incremento e decremento

  • Per le assegnazioni composte pi comuni sono previsti degli operatori espliciti:
  • ++--
  • Significato:
    • ++ +=1
    • -- -=1
  • Esempi:
    • x++; /*equivale a x = x + 1*/
    • valore--; /*equivale a valore = valore 1 */

67. Operatori di incremento e decremento

  • Possono essere utilizzati sia in notazioneprefissache in notazionepostfissa
  • Prefissa: la variabile viene modificata prima di essere utilizzata nellespressione
  • Postfissa: la variabile viene modificata solo dopo averla utilizzata nellespressione
  • Esempio: assumendox = 4:
    • Se si eseguey = x++,si otterr come risultato x = 5ey = 4;
    • Se si eseguey = ++x,si otterr come risultato x = 5ey = 5;

68. Operatori relazionali

  • Operano su quantit numeriche o di tipochare forniscono un risultato logico o booleano.
  • ===!=
  • Il risultato sempre di tipoint:
    • risultato= 0 significaFALSO
    • risultato0 significaVERO
  • In C (C89) non esiste un tipo logico o booleano !

69. Esempio

  • main()
  • {
  • float dato1, dato2;
  • int inter1, inter2;
  • short int switch1, flag;
  • dato1 = 10.5;
  • dato2 = 3.7;
  • inter1 = 2;
  • inter2 = 1;
  • switch1 = dato1 < (dato2 * 0.5);
  • /*switch1 = 10.5 < 1.85 = FALSO (= 0)*/
  • flag = inter1 != inter2; /*flag = VERO( 0)*/
  • }

70. INFORMATICA Algebra di Boole 71. Operatori logici

  • Operano su espressioni booleane e forniscono un risultato logico o booleano.
  • !&&||
  • NOTANDOR
  • Equivalenti agli operatori Booleani di base.
    • Stesse regole di precedenza
      • NOT > AND > OR
  • Esempi:
    • (x > 0)&&(x < 10) (x compreso tra 1 e 9)
    • (x1>x2)||(x1==3)

72. Esempio

  • #define FALSO 0
  • #define VERO 1
  • main()
  • {
  • int dato1,dato2;
  • short int test, flag, condiz;
  • dato1 = 5;
  • dato2 = 3;
  • flag = VERO;
  • test = !flag;/*test = NOT flag cio FALSO(= 0)*/
  • condiz = (dato1>=dato2)&&test;
  • /*condiz =VEROAND FALSOcioFALSO(= 0) */
  • }

73. Operatori di manipolazione dei bit

  • Il C possiede una serie di operatori che possono agire direttamente sui bit delle variabili e costanti di tipo intero o carattere, dichiarate nel programma.
  • Si tratta di 4 operatori derivati direttamente dalle operazioni booleane di base e di altri 2 che eseguono loperazione di shift (destra e sinistra) di un certo numero di bit.
  • I primi si prestano a mascherare o commutare i bit, i secondi possono essere utili nelle operazioni di divisione e moltiplicazione per 2.
  • Tranne uno, sono tutti operatori binari,che agiscono cio su due espressioni.

74. Richiamo: operatori Booleani AAND B AOR B NOT A AXOR B 1 1 1 1 0 0 1 0 A B 1 0 1 0 0 0 1 0 A B 0 1 1 0 A 0 1 1 1 0 0 1 0 A B 75. Operatori su bit

  • Operatori di manipolazione dei bit:

Binario >> Shift a destra Binario >

    • inserisce degli 0 nelle posizioni pi significative
  • Dati con segno: equivale alloshift aritmetico ;
    • >inserisce un valore uguale al bit pi significativo (bit di segno) mantenendo pertanto inalterato il segno;

80. Operatori di shift

  • Esempio:
    • unsigned char x = 15; /*x = 00001111*/
    • x = x > 2 /*x =00 000011(15/2 2 = 3)*/
    • char x = -15 /*x = 11110001*/
    • x = x 2 /*x =11 111100(-15/2 2= - 4)*/
  • Anche per questi operatori consentita la scrittura abbreviata:
  • x