Espressioni e Operatori

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

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:

Dichiarazioni e tipi predefiniti nel linguaggio C

Lezione 5 e 6. Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza. Valentina Ciriani ( ) Laboratorio di programmazione

Cast implicito. Il cast è fatto automaticamente quando un tipo più basso viene assegnato ad un tipo più alto. byte short int long float double

Dati due punti sul piano calcolare la loro distanza

Qualsiasi programma in C++ segue lo schema:

Laboratorio di Informatica I

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

LINGUAGGI DI PROGRAMMAZIONE!

Elementi di Informatica A. A. 2016/2017

#include <stdio.h> /* l esecuzione comincia dalla funzione main */ int main()

Assegnazione di una variabile

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

Ingegneria Elettronica Ingegneria delle Telecomunicazioni (J-Z) Ing. Antonio Monteleone A.A. 2001/02 3 ciclo

Linguaggio C: Espressioni

Lezione 6 Introduzione al C++ Mauro Piccolo

Introduzione alla programmazione in linguaggio C

Laboratorio di Informatica I

Struttura di un programma C++

Tipi di dato, Alessandra Giordani Lunedì 7 maggio 2011

Espressioni ed operatori in C

Espressioni ed operatori in C

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

OCA JAVA 7 SE PROGRAMMER I DOCENTE: DOTT. FAUSTO DELL ANNO

Linguaggi di programmazione

I/O da tastiera + Alessandra Giordani Lunedì 2 maggio

Tipi strutturati - struct

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 5 31/10/2013

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

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

Fondamenti di C++ Input/Output di base

Variabili e Costanti

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

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

IL LINGUAGGIO C TIPI DI DATO

Algebra di Boole: Concetti di base. E un algebra basata su tre operazioni logiche

STRUTTURE DI CONTROLLO IN C. Docente: Giorgio Giacinto AA 2009/2010

Linguaggio C: Espressioni

IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Introduzione al linguaggio C Primi programmi

Variabili e Funzioni. Informatica 1 / 19

Linguaggio C - sezione dichiarativa: costanti e variabili

Il linguaggio C. Puntatori e dintorni

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Programmazione Procedurale in Linguaggio C++

Laboratorio di Informatica I

Linguaggi di Programmazione I Lezione 9

Struttura di un linguaggio

Linguaggio C: Espressioni

JavaScript Core Language. Prof. Francesco Accarino IIS Atiero Spinelli Sesto San Giovanni via leopardi 132

STRUTTURE DI CONTROLLO DEL C++

IL LINGUAGGIO JAVA. Input, Tipi Elementari e Istruzione Condizionale. Primo esempio di un programma Java

Istruzioni Condizionali

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

Informatica 2 modulo C Massimo Callisto De Donato

Fondamenti di programmazione parte 2. Elementi di informatica IGLP

Laboratorio di programmazione

PROGRAMMA = ALGORITMO

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

Tipi elementari. Stefano Ferrari. Università degli Studi di Milano Programmazione. anno accademico

Quando è necessario elaborare una certa quantità di dati omogenei si possono usare variabili indicizzate: int a0, a1, a2;

Istruzioni semplici e strutturate

Corso di Fondamenti di Informatica

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

Espressioni in Linguaggio C

Java SE 7. Strutture di programmazione (2)

$QDOLVLGHOSURJUDPPDTXDGUDWR

Programmazione in C. La struttura del programma Variabili, espressioni, operazioni

Laboratorio di informatica Ingegneria meccanica

L assegnamento. Andrea Marin. a.a. 2011/2012. Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time

Programmazione in Java (I modulo)

Le basi del linguaggio Java

I puntatori. DD Cap.7 pp KP Cap.6 pp

Fondamenti di Informatica - 1. Prof. B.Buttarazzi A.A. 2011/2012

Università degli Studi di Milano

LINGUAGGI DI PROGRAMMAZIONE

Esercizi Programmazione I

Sunto della scorsa lezione Il linguaggio C. Un Programma con Errori. Il preprocessore. Linguaggi di Programmazione I.

Il linguaggio C. Puntatori e Array

#include <iostream> // libreria che gestisce flusso di input e output. using namespace std; // uso di librerie standard del C++

Parte 3. Puntatori. [S. Dalí The temptation of St. Anthony, 1946] - AA. 2015/16 3.1

IL LINGUAGGIO JAVA. Introduzione alla sintassi di Java La sintassi formalizza le regole sintattiche per scrivere frasi ben formate

Struttura dei programmi e Variabili

Il C nel C++ Struttura di un linguaggio. Elementi lessicali. Spazi. Livello lessicale: Livello sintattico: Livello semantico:

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

ciclo di vita della soluzione (informatica) di un problema

ESPRESSIONI. Ivan Lanese

I cicli. Iterazioni Calcolo della media Istruzioni break e continue

Il linguaggio C. Notate che...

Transcript:

Espressioni e Operatori Lezione 4 Espressioni Un espressione è formata da una o più operazioni Le operazioni sono rappresentate da operandi ed operatori operatore = simbolo che identifica l operazione operando = argomento su cui deve essere eseguita l operazione a + b; Gli operatori del C++ sono unari, binari o ternari gli operandi di un operatore binario sono distinti in operando sinistro (primo argomento dell operatore) e operando destro (secondo argomento dell operatore) 1 2001/02 1

Valutazione delle Espressioni La valutazione di un espressione richiede l esecuzione di una o più operazioni L ordine in cui vengono considerati gli operatori e gli operandi dipende dalle regole di precedenza e di associatività Il risultato dell espressione è (quasi sempre) un R-value Il tipo del risultato dipende dal tipo degli operandi dell espressione 2 Operatori Aritmetici Gli operatori aritmetici sono +, -, *, /, % Il tipo del risultato di un operazione aritmetica è uguale al tipo dell operando più grande 2 * 3.5 // risultato è double 7 / 3; // risultato è intero (2) 21 % 3; //risultato è intero (0) 21 % 3.5; // ERRORE Possono verificarsi errori di eccezione aritmetica divisione per 0, underflow, overflow 3 2001/02 2

Operatori Logico-Relazionali Gli operatori logico-relazionali sono >, <, >=, <=, ==,!=, &&,,! restituiscono un risultato di tipo vero-falso un espressione è falsa se vale 0, vera altrimenti Gli operatori logici vengono valutati da sinistra a destra la valutazione termina non appena è stato determinato il valore dell espressione expr1 expr2; // expr2 non valutata se expr1 è vera!strcmp(s, t); // equivalente a (strcmp(s, t) == 0) 4 Esempio Operatori Relazionali Conta quanti elementi di ivec sono minori del valore di soglia #include <vector> int conta(const vector<int>& ivec, int soglia) { int cnt = 0; vector<int>::iterator iter = ivec.begin(); while(iter!= ivec.end() ) { cnt = cnt + (*iter < soglia); ++iter; } return cnt; } 5 2001/02 3

Utilizzo dei Controlli di Sentinella 1 Ci sono situazioni in cui un'operazione è legale solo se alcune precondizioni sono verificate Dereferenziazione di un puntatore solo se il puntatore non è 0 Accesso ad un elemento di un array solo se l'indice è corretto Divisione solo se il divisore è diverso da 0 6 Utilizzo dei Controlli di Sentinella 2 Se le precondizioni non sono soddisfatte si verifica un comportamento anomalo del programma Si possono usare gli operatori logici per effettuare queste operazioni solo se le precondizioni sono verificate int *ptr = 0, i; (ptr) && (i = *ptr); 7 2001/02 4

Operatori di Assegnamento 1 L operatore di assegnamento è = L'operatore di assegnamento modifica il valore di una variabile (la variabile aveva gia un valore) L'operatore di inizializzazione assegna un valore ad una variabile appena creata L operando di destra è un R-value e l operando di sinistra è un L-value 8 Operatori di Assegnamento 2 Il risultato di un assegnamento è l R-value dell operando destro Il tipo dell assegnamento è il tipo dell operando sinistro int i, *ip, ia[4] = {0}, j; i = ia[0] + 1; // risultato 1, intero int *ip = &j; *ip = i*2 + ia[i]; // risultato 2, intero 9 2001/02 5

Operatori di Assegnamento È possibile concatenare operazioni di assegnamento se tutti gli operandi a cui si devono assegnare valori sono dello stesso tipo int i, j; i = j = 0; // CORRETTO int i = j = 0; // ERRORE L operatore di assegnamento composto permette di compattare la notazione a op= b; ==> a = a op b; È possibile comporre +, -, *, /, %, &,, <<, >>, ^ 10 Operatori di Incremento e Decremento Gli operatori di incremento e decremento sono ++, -- i++ ===> i = i + 1; i-- ===> i = i - 1; Esistono due versioni dello stesso operatore ++i prima incrementa il valore di e poi lo legge i++ prima legge il valore di i e poi lo incrementa int i = 0, ia[3] = { 0, 1, 2 }; int c = ia[i++]; // c = 0, i = 1 c = ia[++i]; // i = 2, c = ia[2] 11 2001/02 6

Operatore sizeof L operatore sizeof restituisce la dimensione in byte di un oggetto o di un tipo Il risultato di un sizeof è di tipo size_t (tipo dipendente dalla macchina definito nell'header file cstddef) Il risultato di un sizeof è una costante sizeof( expr ); // dimensione del tipo di expr sizeof epxr; sizeof( int ); // dimensione di int L operatore sizeof applicato ad un array restituisce il numero di byte occupati dall array int ia[] = { 0, 1, 2 }; sizeof( ia ) / sizeof( int ); // il risultato è 3 12 Operatore Condizionale 1 L operatore condizionale (if aritmetico) è l unico operatore ternario del C++ La sintassi è expr1? expr2 : expr3; se expr1 è vera il risultato è expr2, altrimenti è expr3 13 2001/02 7

Operatore Condizionale 2 #include <iostream> main() { // calcola parità int i; cout << dammi un intero << endl; cin >> i; cout << i << è ; cout << (i % 2)? dispari : pari << endl; } 14 Operatore Virgola La virgola serve a separare sotto-espressioni Un espressione formata da sotto-espressioni separate da virgole ha come risultato il valore dell ultima sotto-espressione int ia[3], m[3][4]; int i = ( ia!= 0 )? ia[1]++, 1 : 0; m[1, 2] = 100; // dove abbiamo scritto? 15 2001/02 8

Operatori ai Bit Gli operatori ai bit sono %,, ^, ~, <<, >> Leggono gli operandi come sequenze di bit Possono operare su uno (o più) specifico bit Il controllo sulla correttezza delle operazioni è delegato completamente al programmatore Gli operandi sono detti bitvector Utilizzati per rappresentare in modo compatto insiemi di flag Sono di tipo intero (int, short, long, char) È consigliabile che siano unsigned Nella libreria iostream i bitvector sono usati per rappresentare il formato del flusso (tipo di rappresentazione, numero di cifre decimali, etc.) 16 Esempio Operatori ai Bit unisgned char i = 101; // 01100101 unsigned char j = 151; // 10010111 j = ~j; // 01101000 (104) j << 1; // 11010000 (208) j >> 2; // 00110100 (52) j &= i; // 00100100 (36) j ^= i; // 01000001 (65) j = i; // 01100101 (101) 17 2001/02 9

Classe bitset La libreria standard fornisce la classe bitset che implementa il tipo di dati astratto sequenza di bit Fornisce operazioni per manipolare e testare insiemi di bit, indipendenti dalla rappresentazione dei bit Definizione di variabili bitset bitset<24> bitvec; 18 Principali operazioni su bitset test(pos) // controlla se il bit pos è 1 any() // controlla se qualche bit è 1 none() // controlla se nessun bit è 1 count() // conta quanti bit sono 1 size() // conta quanti sono i bit [pos] // accedi al bit pos flip(pos) // inverte il bit pos set(pos) // mette a 1 il bit pos reset(pos) // mette a 0 il bit pos 19 2001/02 10

Conversioni di oggetti bitset È possibile convertire oggetti bitset in altri tipi: string con la funzione to_string() unsigned long con la funzione to_long() Queste conversioni sono utili per passare oggetti bitset a funzioni C o C++ prestandard che non conoscono la classe bitset 20 Esempio uso classe bitset #include <bitset> bitset<32> bitvec(0xffff); // crea un bitset di 32 bit bool is_set = bitvec.any(); int count; if(is_set) // se c'è un bit a 1 conta quanti bit sono a 1 count = bitvec.count(); else bitvec.flip(); // inverte tutti i bit for(int i = 0; i<bitvec.size(); i++) if(i % 2) // setta a 1 i bit di posizione pari bitvec.set(i); else bitvec.reset(i); // e a 0 gli altri 21 2001/02 11

Espressioni New e Delete Ad ogni programma è assegnata una porzione di memoria utilizzabile in fase di esecuzione Per allocare la memoria si utilizza l'espressione new int* pi = new int(10); // alloca un int e lo inizializza con 10 int* pia = new int[4]; // alloca un vettore di interi con 4 elementi Gli oggetti allocati dinamicamente non hanno nome e devono essere referenziati tramite puntatori Per rilasciare la memoria dinamica si utilizza l'espressione delete delete pi; delete [] pia; //Cancella la memoria allocata a pi //Cancella il vettore allocato a pia 22 Operazioni di Input/Output Il C++ non prevede nessun operatore per effettuare operazioni di input/output La libreria standard fornisce classi e operatori che permettono di effettuare operazioni di input/output (iostream) I dispositivi di input/output sono rappresentati dall'astrazione di flusso (stream) cin è un oggetto istream che identifica lo standard input cout è un oggetto ostream che identifica lo standard output L'operatore << inserisce un oggetto nel flusso di output L'operatore >> estrae un oggetto dal flusso di input 23 2001/02 12

Regole di Precedenza La sintassi del C++ definisce delle regole di precedenza tra gli operatori che vengono utilizzate per valutare espressioni composte un espressione composta è valutata considerando prima gli operatori con più alta precedenza, in ordine da sinistra a destra 6+3*4/2+2; // 6+((3*4)/2)+2 = 14 while(ch = nextchar()!= '\n') // che fa? È possibile modificare l ordine di valutazione degli operatori utilizzando le parentesi una coppia di parentesi individua una sotto-espressione la valutazione di una sotto-espressione ha massima precedenza 24 Regole di Associatività Per ogni operatore è definito un livello di precedenza ed un tipo di associatività Associatività a destra o a sinistra La regola di associatività specifica come viene interpretata un'espressione in cui compare più volte lo stesso operatore Associatività a destra i = j = k = 1; // (i = (j = (k = 1))) Associatività a sinistra i + j + k; // (i + j) + k) 25 2001/02 13

Regole di Conversione di Tipo Quando in un espressione sono presenti operandi di tipo diverso il programma deve operare delle conversioni di tipo Una conversione di tipo non provoca alterazioni nel contenuto della memoria Modifica solo il tipo di un dato Esistono tre tipi di conversioni Implicite, aritmetiche ed esplicite 26 Regole di Conversione Implicita Le conversioni implicite sono eseguite automaticamente dal compilatore Le conversioni implicite sono eseguite secondo regole dette conversioni standard Il programma può introdurre proprie regole di conversione standard (ma non per i tipi predefiniti) 27 2001/02 14

Regole di Conversione Implicita In un assegnamento si converte automaticamente l R-value dell operando destro al tipo dell operando sinistro Il tipo della variabile passata ad una funzione viene convertito nel tipo dell argomento della funzione Il tipo dell'oggetto restituito dal return è convertito nel tipo del risultato della funzione Tutte queste conversioni sono realizzate con la creazione di variabili temporanee 28 Regole di Conversione Aritmetica Le conversioni aritmetiche garantiscono che gli operandi di un operatore binario siano dello stesso tipo Tutti gli operandi sono convertiti nel tipo dell operando più grande Le regole sono Ogni operando può essere solo promosso Tutti gli operandi più piccoli di un int sono sempre promossi ad int prima di essere valutati Promuovere un operando char a int significa Leggere il valore ASCII del char Copiarlo in una variabile int temporanea 29 2001/02 15

Regole di Conversione Esplicita Viene effettuata attraverso l operazione di cast tipo_cast<tipo>(expr); L'operazione di cast è pericolosa perché aggira il sistema di controlli sui tipi del compilatore Non tutti i cast sono sicuri La conversione di un tipo in un tipo più piccolo è non sicura perché tronca la rappresentazione del dato Il compilatore non esegue mai automaticamente un cast non sicuro 30 Utilizzo dei Cast Referenziare puntatori generici (void) Evitare delle conversioni inutili nella valutazione di un espressione Scavalcare il controllo sui tipi predisposto dal compilatore Eliminare ambiguità nella valutazione di un espressione se più conversioni implicite sono possibili il compilatore non sceglie e segnala un errore di ambiguità 31 2001/02 16

Tipi di Cast Il C++ standard distingue 4 diversi tipi di cast, a seconda dell'utilizzo Solo per migliorare la leggibilità del codice const_cast<t>(expr); // rende expr (non) costante static_cast<t>(expr); // trasforma il tipo di expr in T reinterpret_cast<t>(expr); /* legge il pattern di bit all'indirizzo di expr come se fosse di tipo T */ dynamic_cast<t>(expr) /* implementa il run time type identification */ 32 Cast C-style Nel C++ pre-standard esisteva un solo di tipo di cast T (expr); (T) expr; int (3.14); // converte il tipo di expr a T // tronca la parte decimale (short) 123456l; // tronca la rappresentazione del numero Per motivi di compatibilità, nello standard è ancora supportato questo tipo di cast, ma ne è deprecato l'uso 33 2001/02 17

Istruzioni Un istruzione è la più piccola unità di codice eseguibile di un programma C++ Ogni istruzione è caratterizzata da un ; come carattere finale Un istruzione composta è formata da più operazioni elementari un operazione composta è racchiusa tra {} e non è seguita dal ; Un istruzione composta può sostituire un istruzione semplice Un blocco è un istruzione composta che contiene definizioni 34 Istruzioni di Dichiarazione Dichiarano o definiscono una variabile Possono comparire in qualunque punto del codice Il C++ incoraggia a definire le variabili solo nel momento in cui servono Evita di definire variabili non inizializzate Evita inutili inizializzazioni Consente di allocare memoria solo alle variabili realmente utilizzate È possibile definire variabili nella linea di controllo di un'istruzione di controllo del flusso La variabile è visibile solo all'interno del blocco associato all'istruzione 35 2001/02 18

Istruzioni di Controllo del Flusso L ordine di esecuzione delle istruzioni di un programma è sequenziale, a partire dalla prima linea della funzione main() Le istruzioni di controllo del flusso servono a modificare l ordine di esecuzione delle istruzioni del programma 36 if then else L if è un istruzione condizionale che permette di scegliere tra al più due casi if (expr) ist; l'istruzione ist è eseguita solo se expr è vera if (expr) ist1; else ist2; se expr è vera viene eseguita ist1, altrimenti viene eseguita ist2 Istruzioni di if annidate sono fonti di potenziali errori dangling else 37 2001/02 19

switch Lo switch è un istruzione condizionale che permette di scegliere tra più casi switch (expr) { case i: ist-i; break; case j: ist-j; break; default: ist; } 38 while Il while è un istruzione di ciclo while (expr) ist; esegue ist fino a quando expr è vera L ordine di esecuzione è 1) valuta expr 2) se expr è vera esegui ist e torna ad 1 3) esegui la prossima istruzione 39 2001/02 20

for Il for è un istruzione di ciclo for( ist_iniz; expr1; expr2) ist; esegue ist_iniz, quindi esegue ist e expr2 fino a quando expr1 è vera L ordine di esecuzione è 1) esegui ist_iniz 2) valuta expr1 3) se expr1 è vera esegui prima ist, poi expr2 e torna a 2) 4) esegui prossima istruzione 40 do while Il do è un istruzione di ciclo do ist; while (expr); esegue ist fino a quando expr non diventa falsa almeno una volta l istruzione ist viene eseguita L ordine di esecuzione è 1) esegui ist 2) valuta expr 3) se expr è vera torna a 1), altrimenti esegui prossima istruzione 41 2001/02 21

Salti Le istruzioni di salto spostano il controllo del programma Esistono tre istruzioni di salto break interrompe il ciclo che si sta eseguendo continue interrompe l iterazione del ciclo che si sta eseguendo goto label salta incondizionatamente all istruzione etichettata label label deve stare nella stessa funzione che contiene goto 42 2001/02 22