Home / Indice sezione
 www.icosaedro.it 

M2 Report

<= Istruzione RETURNEspressioni intere =>
Frontespizio
Introduzione
Caratteristiche
Un semplice esempio
Moduli
Sezione IMPORT
Sezione CONST
Sezione TYPE
Tipo FORWARD
Sezione VAR
Sezione FUNCTION
Sezione BEGIN
Stringhe letterali
Sottostringhe
Commenti
Costanti predefinite
Variabili predefinite
Funzioni predefinite
Istruzione di assegnamento
Istruzione per la chiamata di funzione
Ordine di valutazione degli argomenti attuali
Istruzione IF
Istruzione SWITCH
Istruzione FOR
Istruzione WHILE
Istruzione REPEAT
Istruzione LOOP
Istruzione TRY
Istruzione RAISE ERROR
Istruzione RETURN
Espressioni logiche
Espressioni intere
Espressioni reali
Espressioni stringa
Espressioni tra tipi strutturati
Regole di scope
M2 per programmatori C
M2 per programmatori Java
Rappresentazione dei dati in memoria
Keywords
Messaggi di errore a runtime
Sintassi
 

Espressioni logiche

Le espressioni di tipo BOOLEAN possono coinvolgere le costanti letterali FALSE e TRUE, le costanti di tipo BOOLEAN, le variabili di tipo BOOLEAN, e le funzioni che ritornano BOOLEAN. Le espressioni di confronto tra numeri e tipi dinamici ritornano a loro volta un valore BOOLEAN. L'ordine di precedenza con il quale gli operatori logici vengono applicati è: NOT, AND, OR. Le parentesi tonde si possono usare per alterare l'odine di valutazione.

La valutazione delle espressioni booleane avviene da sinistra verso destra. La valutazione si arresta quando il risultato della espressione è determinato univocamente (valutazione breve delle espressioni booleane). Questo significa che in un prodotto AND di fattori il primo fattore che risulta FALSE determina il risultato, mentre in una somma OR di termini il primo termine che risulta TRUE determina il risultato. La valutazione breve avviene anche per le sotto-espressioni di una espressione booleana. La valutazione breve implica due conseguenze di cui il programmatore deve tenere conto:

  • E' possibile rendere più sintetico il codice di certe forme ricorrenti. Ad esempio, se r è è un RECORD di una lista concatenata, allora il seguente codice ricerca un elemento:
    r = root
    WHILE (r <> NIL) AND (r[name] <> target) DO
        r = r[next]
    END
    IF r = NIL THEN
        print("record not found")
    ELSE
        print("found record r")
    END
    
    Il ciclo WHILE esegue la scansione della lista a partire dall'elemento radice. Notare che quando la lista è terminata (r = NIL) il secondo fattore della espressione logica AND non viene valutato, così prevenendo l'errore fatale di esecuzione che si avrebbe dereferenziando il record.

  • Se l'espressione logica ha effetti collaterali è difficile prevedere il risultato finale della valutazione. Ad esempio, le funzioni booleane f() e g() che compaiono nella espressione booleana
    IF f() AND g() THEN
        (* ... *)
    END
    
    possono essere richiamate entrambe (se f() ritorna TRUE) o solo la prima (se f() ritorna FALSE).

Operatori di confronto che generano valori BOOLEAN

Le espressioni logiche possono contenere espressioni di confronto tra INTEGER, REAL, STRING, ARRAY e RECORD. Queste espressioni generano valori logici BOOLEAN attraverso gli operatori di confronto e hanno la forma

espressione1 operatore_di_confronto espressione2

Le due espressioni a sinistra e a destra dell'operatore di confronto devono essere dello stesso tipo. Il valore speciale NIL è compatibile per confronto con STRING, ARRAY e RECORD.

Una espressione di confronto deve essere inclusa tra parentesi tonde quando viene affiancata dagli operatori logici NOT AND OR. Quindi queste espressioni logiche sono corrette:

1 < 2
(1 < 2) AND (3 = 5)

Gli operatori di confronto tra valori INTEGER sono:

< <= = >= > <>

che restituiscono TRUE se il valore risultante dal calcolo della espressione di sinistra dell'operatore è rispettivamente minore, minore o uguale, uguale, maggiore o uguale, maggiore, diversa dal valore risultante dal calcolo della espressione di destra.

Gli operatori di confronto tra REAL sono gli stessi che per i valori INTEGER. Siccome non è possibile mescolare valori INTEGER e valori REAL, le funzioni itor() e rtoi() esportate dal modulo m2 permettono di eseguire le necessarie conversioni.

Sulle stringhe è definito un ordinamento: la stringa NIL è minore di ogni altra stringa; la stringa vuota "" è minore di ogni altra stringa contenente almeno un carattere:

NIL < "" < "abc"

Il confronto tra due stringhe non-NIL e non-vuote avviene carattere per carattere partendo da sinistra e procedendo verso destra fino ad incontrare un carattere diverso o la fine di una delle due stringhe. Se si trova un carattere diverso la stringa minore è quella che ha il carattere minore. Se invece ricorre la fine di una delle due stringhe senza che si sia trovato un carattere diverso, la stringa più corta è la minore. Gli operatori di confronto tra STRING restituiscono un valore BOOLEAN, e sono:

s1<s2 La stringa s1 è minore di s2
s1<=s2 La stringa s1 è minore o uguale a s2
s1=s2 Le due stringhe sono uguali, cioè sono NIL, oppure vuote, oppure contengono gli stessi caratteri
s1<>s2 Le due stringhe sono diverse.
s1>=s2 La stringa s1 è maggiore o uguale a s2
s1>s2La stringa s1 è maggiore di s2

Gli operatori di confronto tra ARRAY si applicano ad array dello stesso tipo. Ciò che viene confrontato è l'indirizzo di memoria dove gli array sono allocati, non i valori che essi contengono. Gli operatori di confronto tra array sono:

a1 = a2
Restituisce TRUE se entrambi gli array sono NIL oppure sono lo stesso array.

a1 <> a2
Restituisce TRUE se uno degli array è NIL e l'altro no, oppure se sono array differenti.

Gli operatori di confronto tra RECORD si applicano a RECORD dello stesso tipo. Ciò che viene confrontato è l'indirizzo di memoria dove i record sono allocati, non i valori che essi contengono. Gli operatori di confronto tra array sono:

r1 = r2
Restituisce TRUE se entrambi i record sono NIL oppure sono lo stesso record.

r1 <> r2
Restituisce TRUE se uno dei record è NIL e l'altro no, oppure se sono record differenti.

 
<= Istruzione RETURNEspressioni intere =>

Umberto Salsi

Contatto
Mappa
Home / Indice sezione