Indice. Ordine di valutazione. Espressioni in C++ Le espressioni in C++ (CAP 4) Alberto Garfagnini e Marco Mazzocco A.A. 2014/ * 20 / 2

Documenti analoghi
Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Linguaggio C: Espressioni

Espressioni ed operatori in C

Corso di JavaScript. Prerequisiti. B1 Tipi di dato e operatori. Concetto di variabile, espressione e tipo di dato

Unità Didattica 2 Linguaggio C. Espressioni, Operatori e Strutture linguistiche per il controllo del flusso

Tipi di dato. Il concetto di tipo di dato viene introdotto per raggiungere due obiettivi:

Linguaggio C Espressioni e operatori

Corso di Fondamenti di Informatica

Linguaggio C. Tipi predefiniti e operatori. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Il potere espressivo di un linguaggio è caratterizzato da: PROGRAMMA = DATI + CONTROLLO

LINGUAGGI DI PROGRAMMAZIONE!

Tipi di dato primitivi

Conversioni fra Tipi di Dati. Luca Abeni

Laboratorio di programmazione

IL LINGUAGGIO C TIPI DI DATO

Un elaboratore è un manipolatore di simboli (segni) intrinsecamente capace di trattare vari. caratteri char caratteri ASCII unsigned char

Corso di Fondamenti di Informatica Il sistema dei tipi in C++

Capitolo 2 Introduzione alla programmazione in C

Programmare in C. Maurizio Palesi Salvatore Serrano. Valori. Operazioni. Un insieme di valori del tipo. Per operare su tali valori Tipi

Espressioni. Espressione = meccanismo fondamentale per esprimere computazioni in un LP importante comprenderne la semantica!

Cap. 4: Espressioni. Operatori

Valutazione di espressioni

Espressioni con effetti collaterali

Costrutti per il controllo del flusso di esecuzione

IL PROBLEMA DEL PROGETTO

Programmazione Procedurale in Linguaggio C++

Programmazione in Java (I modulo)

Gli Operatori. Linguaggio C. Gli Operatori. Esempi sull uso dell Operatore di Assegnamento. L Operatore di Assegnamento

Basi della programmazione in Java. Anteprima. Uso delle variabili. Il concetto di variabile Uso delle variabili. Input da tastiera I tipi Esercizi

Tipi di dati fondamentali. Tipi di dati fondamentali. Utilità dei tipi di dati nelle dichiarazioni. Il tipo di dati char. Codice ASCII.

Lab 02 Tipi semplici in C

Laboratorio di Informatica Ingegneria Clinica Lezione 9/11/2011. Prof. Raffaele Nicolussi

$QDOLVLGHOSURJUDPPDTXDGUDWR

Esame di INFORMATICA (*) Operazioni Aritmetiche: Somma. Lezione 3. Operazioni Aritmetiche: Somma. Operazioni Aritmetiche: Somma

# $ %$&'" '! () *$+,!-

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Espressioni. Espressioni. Valutazione di un espressione. Espressioni semplici

Tipi elementari, costanti. Tipi di dati. VALORI: un insieme dei valori del tipo OPERAZIONI: per operare su tali valori. Tipi. intero reale carattere

La sintassi del C APPENDICE H

Laboratorio di Programmazione Laurea in Ingegneria Civile e Ambientale

Informatica 1 Tipi e dichiarazioni in C++ C++ - Tipi e dichiarazioni 1

Espressioni ed operatori

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

1 PANORAMICA SUL LINGUAGGIO C

Tipi di dato, Alessandra Giordani Lunedì 7 maggio 2011

Tipi di dato. Le variabili in C. Problema: dato in input un carattere, se esso è una lettera minuscola, trasformarla in maiuscola.

Puntatori in C. Puntatori. Variabili tradizionali Esempio: int a = 5; Proprietà della variabile a: nome: a

Corso di Fondamenti di Informatica

Istruzioni semplici e strutturate

Costanti e Variabili

Lezione 6 Introduzione al C++ Mauro Piccolo

Programmazione Procedurale in Linguaggio C++

Laboratorio di informatica Ingegneria meccanica

Tipi elementari, costanti. Tipi di dati. VALORI: un insieme dei valori del tipo OPERAZIONI: per operare su tali valori. Tipi. intero reale carattere

Corso di Laurea Ingegneria Civile Fondamenti di Informatica. Dispensa 13. Tipi ed espressioni. Carla Limongelli Aprile Tipi ed espressioni 1

Fondamenti di Programmazione. Strutture di controllo

Tipo intero. Esempio. Tipo intero: operatori. Programma PortaMonete.java. Tipi base o primitivi

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

Espressioni e Operatori

Linguaggio C - sezione dichiarativa: costanti e variabili

IL LINGUAGGIO C Un elaboratore è un manipolatore di simboli (segni) L'architettura fisica di ogni elaboratore è intrinsecamente capace

Sintassi: Per la dichiarazione di variabili dei tipi fondamentali:

Tipi ed espressioni. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 5. Carla Limongelli Settembre 2007

Verso i puntatori: Cosa è una variabile?

Il linguaggio C. Notate che...

Gli Operatori. Università degli Studi di Brescia

Si possono applicare solo a variabili (di tipi interi, floating o puntatori), ma non a espressioni generiche (anche se di questi tipi).

5. Tipi di dato ed espressioni. Andrea Marongiu Paolo Valente

Laboratorio di Informatica

Introduzione al C++ (continua)

ELEMENTI DI INFORMATICA L-B. Ing. Claudia Chiusoli

Per gli esercizi sulla algebra booleana, si consiglia di verificare tramite tabelle di verità le equivalenze logiche proposte sulle dispense.

Tipi di dato semplici

Esercizi Programmazione I

Istruzioni iterative (o cicliche)

Introduzione a Java. Riferimenti

Informatica/ Ing. Meccanica/ Edile/ Prof. Verdicchio/ 17/01/2014/ Foglio delle domande / VERSIONE 1

VBA è un linguaggio di scripting derivato da Visual Basic, da cui prende il nome. Come ogni linguaggio ha le sue regole.

Tipi di dato. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

direttive del preprocessore simboli speciali parole chiave identificatori costanti

Le etichette nei programmi. Istruzioni di branch: beq. Istruzioni di branch: bne. Istruzioni di jump: j

Programma del corso. Elementi di Programmazione. Introduzione agli algoritmi. Rappresentazione delle Informazioni. Architettura del calcolatore

Appunti del corso di Informatica 1 (IN110 Fondamenti) 5 Rappresentazione delle informazioni

Programmazione Caratteri, stringhe, tipo unit ed ennuple

Appunti del corso di Informatica 1 (IN110 Fondamenti) 6 Introduzione al linguaggio C

Introduzione alla programmazione in C++

Strutture di controllo del flusso di esecuzione in assembler. MC68000: Status Register

Tipi di dati strutturati e Linguaggio C. Record o strutture Il costruttore struct in C

Breve Manuale di Riferimento sulla Sintassi Linguaggi C++ e FORTRAN

Il Linguaggio C. Caratteristiche. Caratteristiche. Esempio di programma in C. Tipi di dato primitivi in C. Dati

C espressioni condizionali

Aritmetica in virgola mobile Algebra di Boole e reti logiche Esercizi. Mercoledì 8 ottobre 2014

3) Descrivere l architettura di un elaboratore tramite astrazione a livelli

Informatica. appunti dalle lezioni del 14 e 18/10/2010

Corso di Laurea Ingegneria Civile. Dispensa 13. Tipi ed espressioni. Carla Limongelli. Tipi ed espressioni 1

Appunti del corso di Informatica 1. 6 Introduzione al linguaggio C

Arithmetic and Logic Unit e moltiplicatore

PROGRAMMAZIONE: Le strutture di controllo

Fondamenti di Informatica 1. Prof. B.Buttarazzi A.A. 2010/2011

Tipi interi lo standard (1)

Transcript:

Le espressioni in C++ (CAP 4) Indice Le espressioni in C++ : precedenze e associatività degli operatori Alberto Garfagnini e Marco Mazzocco Università degli studi di Padova A.A. 2014/2015 gli operatori aritmetici gli operatori logici e relazionali diseguaglianze in C++ gli operatori di incremento e decremento l operatore condizionale gli operatori booleani per operare sui bit degli interi l operatore sizeof Espressioni in C++ Un espressione in C++ è composta da uno o più operandi e fornisce un risultato una volta valutata Gli operatori si dividono in categorie: operatori unari, come l address-of (&) e dereference (*) agiscono su un unico operando operatori binari, come l uguaglianza (==) e la moltiplicazione (*) che agiscono su due operandi esiste anche un operatore ternario che richiede tre operandi la chiamata a funzione richiede un numero variabile di operandi (da zero ad un numero grande, a seconda della funzione) per comprendere come le espressioni vengono valutate, è necessario capire la precedenza e associatività degli operatori 5 + 10 * 20 / 2 per poter determinare il risultato dell espressione è necessario studiare come si comportano gli operatori che la compongono Ordine di valutazione la precedenza definisce come sono raggruppati gli operandi di un espressione complessa nulla è specificato riguardo all ordine di valutazione int i = sqrt(val) * f2(); le due funzioni saranno invocate prima della moltiplicazione, ma non c e nessun modo di conoscere l ordine di chiamata int i = 0; cout << i << " " << ++i << endl; non c e nessun modo per conoscere come verrà valutata l istruzione : A Il compilatore può valutare prima ++i e poi i producendo come output 1 1 B Il compilatore può valutare prima i e in tal caso avremo come output 0 1 C Il compilatore può decidere un altra strategia a noi sconosciuta

precedenza Gli operatori aritmetici Associativity Operator Function Use Left + unary plus + expr Left - unary minus - expr Left * multiplication expr * expr Left / division expr / expr Left % reminder expr % expr Left + addition expr + expr Left - subtraction expr - expr Gli operatori matematici divisione (/) e modulo (%) Il risultato della divisione dipende dal tipo degli operandi int / int 9 / 5 esegue int division 1 double / double 9.0 / 5.0 esegue double division 1.8 long / long 9L / 5L esegue long division 1 float / float 9.0F / 5.0F esegue float division 1.8 hanno tutti precedenza LEFT RIGHT: 5 + 10 * 20 / 2 = 5 + (10 * 20) / 2 = 5 + 200 / 2 = 5 + (200 / 2) = 5 + 100 = 105 Il modulo (%) ritorna il resto della divisione Può essere usato solo per tipi interi 21 % 6 // risultato = 3 21 % 7 // risultato = 0-21 % -8 // risultato = -5 21 % -5 // risultato = 1 Regola generale: m%(-n) = m%n e (-m)%n = -(m%n) precedenza Gli operatori logici e relazionali Associativity Operator Function Use Right! logical NOT!expr Left < less than expr < expr Left <= less than or equal expr <= expr Left > greater than expr > expr Left >= greater than or equal expr >= expr Left == equality expr == expr Left!= inequality expr!= expr Left && logical AND expr && expr Left logical OR expr expr Gli operatori logici: AND e OR AND è true se entrambi gli operandi sono true, altrimenti è false OR è true se almeno uno dei due è true; false se entrambi false Valutazione SHORT-CIRCUIT : expr1 == false expr1 && expr2 expr1 expr2 expr2 non viene valutata, il risultato è comunque false Gli operatori relazionali <, <=, >, >= si applicano a tutti i tipi aritmetici e ai puntatori Gli operatori logici &&,,! si applicano a tutti i tipi convertibili in bool expr1 == true expr2 non viene valutata, il risultato è comunque true

L operatore logico NOT L operatore di negazione, unario è indicato con il simbolo! Esempi: expr == 0!a!expr (int) 1!(x + 7.7)!(a < b c + d) expr!= 0 L operatore! è diverso dall operatore NOT dell algebra booleana: soltanto nell algebra booleana NOT (NOT a) = a in C/C++ (int) 0!!5 = 1!(!5) =!(0) = 1 Diseguaglianze in C++ In matematica si può scrivere 3 < j < 5 per indicare che la variabile j assume valori compresi tra 3 e 5. Se j=4 3 < j < 5 è true Se j=7 3 < j < 5 è false In C++ 3 < j < 5 è equivalente a (3 < j) < 5 quindi, per j = 7 3 < j < 5 (3 < j) < 5 1 < 5 1 true La maniera corretta per implementare il test è (3 < j) && (j < 5) L espressione è true solo se entrambe le parentesi sono true (3 < j) && (j < 5) true && false => false L operatore di assegnazione È l operatore con la precedenza più bassa di tutti è RIGHT associative : la scrittura: x = y = z = 0; equivale a: (x = (y = (z = 0))); L espressione x == y è molto simile a x = y ma il loro effetto è radicalmente diverso! Errore comune nella scrittura di codice if ( a = 1)... invece di if ( a == 1)... A volte molto difficile da individuare!! Test di eguaglianza Statement di assegnazione Gli operatori incremento e decremento forniscono una notazione convenzionale abbreviata per aggiungere (++) e sottrarre (-) una unità da un oggetto di tipo intero possono essere utilizzati in due forme : prefisso : ++x, --x postfisso : x++, x-- int x = 5; int y = ++x; cout << "x = " << x << "y = " << y << endl; int z = 5; int y = z++; cout << "z = " << z << "y = " << y << endl; incrementa e poi assegna il valore x = 6 e y = 6 Assegna il valore e quindi incrementa z = 6 e y = 5 Usate operatori POSTFISSI soltanto quando strettamente necessario

Uso dell operatore postfisso La versione post-fix degli operatori incremento ++ e decremento - è interessante quando si vuole usare il contenuto di una variabile e incrementarla con una singola espressione compatta Esempio vector<double v;... auto pbeg = v.begin(); // stampa tutti gli elementi fino al primo valore negativo; while (pbeg!= v.end() && *beg >= 0) cout << *pbeg++ << endl; // stampa il valore corrente // e incrementa pbeg L operatore incremento postfisso ritorna il valore dell oggetto e poi incrementa il suo contenuto È un operatore ternario L operatore condizionale Sintassi: expression1? expression2 : expression 3 Funzionamento: Se expression1 è true, allora il valore dell espressione condizionale è quello di expression2. Altrimenti, il valore dell espressione è quello di expression3 Esempi : voto > 18? "esame superato" : "ritenta" voto = 30; true "esame superato" voto > 18? "esame superato" : "ritenta" voto = 15; false "ritenta" precedenza Bitwise operators Associativity Operator Function Use Left bitwise NOT expr Left << left shift expr << expr Left >> right shift expr >> expr Left & bitwise AND expr & expr Left bitwise XOR expr expr Left bitwise OR expr expr lavorano su tipi interi, signed e unsigned, visi come sequenze di bit se uno dei due operandi è un intero di piccole dimensioni (char, short, ecc), viene prima convertito a int Gli operatori di shift <<) e >> Sono di due tipi: right-shift: (>>) e left-shift: (<<) spostano a sinistra (<<) o destra (>>) l operando a sinistra di un numero di bit indicato dall operando di destra unsigned char bits = 0x9B; 10011011 bits << 8 00000000 00000000 10011011 00000000 bits >> 3 00000000 00000000 00000000 00010011 L operatore left-shift: << inserisce bit con valore 0 a sinistra L operatore right-shift: >> inserisce bit concordi al segno (0 se numero positivo, 1 se negativo) a destra

Gli operatori NOT, AND, OR e XOR L operatore NOT ( ) complementa i singoli bit del tipo intero unsigned char bits = 0x9B; 10011011 ~ bits 11111111 11111111 11111111 01100100 gli altri operatori generano un nuovo intero come risulstato dell operazione logica bit a bit unsigned char b1 = 0145; 01100101 unsigned char b2 = 0257; 10101111 b1 & b2 0.. 24 bit a zero...0 00100101 b1 b2 0.. 24 bit a zero...0 11101111 L operatore sizeof L operatore sizeof ritorna la dimensione, in bytes, di un espressione oppure di un tipo il risultato è un espressione costante di tipo size_t esistono due forme : sizeof(type) sizeof expr Esempi Sales_data data, * p; sizeof(sales_data); sizeof data; sizeof p; sizeof *p; // size required for Sales_data object // same as sizeof(sales_data) // size of a pointer // size of the type at which p points // i.e. sizeof(sales_data) b1 ^ b2 0.. 24 bit a zero...0 11001010 sizeof data.isbn sizeof Sales_data::isbn // size of isbn Sales_data s member // alternative was of isbn size Le conversioni tra tipi Conversioni in espressioni aritmetiche Tutti gli operazioni vengono effettuate tra operandi dello stesso tipo se i tipi sono diversi, viene attuata una conversione int i = 3.541 + 3; i due operandi della somma sono diversi: double + int int viene promosso a double la somma viene effettuata in virgola mobile ed il risultato viene trasformato in int ed usato per inizializzare la variabile i le conversioni prendono il nome di conversioni implicite Quando avvengono? tipi interi più piccoli di int sono convertiti all intero più grande in espressioni relazionali, non-bool sono convertiti a bool in inizializzazioni, l inizializzatore è convertito al tipo della variabile in espressioni aritmetiche e relazionali con tipi misti, i tipi sono convertiti ad un tipo comune Promozioni tra interi 1. char, short (signed and unsigned) sono promossi a int 2. se dopo la prima conversione l espressione è di tipo misto: l operando di tipo inferiore è promosso al tipo superiore secondo le regole: 3. nel caso di operandi signed e unsigned, il tipo con meno bit viene convertito a quello con più bit 4. se la dimensione è la stessa, il tipo signed è convertito a quello unsigned Regole di conversione: 1. long long double l; 2. long double 3. double d; 4. float f; 5. unsigned long 6. unsigned u; 7. long l; 8. int i; 9. char c, short s; promozione

Esempi di conversioni aritmetiche bool Bflag; char Cval; short Sval; unsigned short USval; int Ival; unsigned int UIval; long Lval; unsigned long ULval; float Fval; double Dval; 3.1419 + a ; // a -> int, then int -> double Dval + Ival; Dval + Fval; Ival = Dval; Bflag = Dval; Cval + Fval; Sval + Cval; // Ival, int -> double // Fval, float -> double // Dval, double -> int (truncation) // if Dval is 0 -> false, else true // Cval, char -> int, then int -> float // Sval, short -> int, Cval, char -> int Cval + Lval; // Cval, char -> long Ival + ULval; // Ival, int -> unsigned long USval + Ival; // dipende dalle dimensioni di unsigned short e int UIval + Lval; // dipende dalle dimensioni di unsigned int e long