In questo articolo verranno trattati alcuni degli aspetti un po piu matematici della programmazione in C. Forse sarà il caso di andare a spolverare i libri di algebra delle superiori...:-)
E una lezione prettamente teorica e probabilmente richiederà piu tempo e piu attenzione per essere ben compresa rispetto alle altre, è dobbligo che alcune cose (mi raccomando le tabelle e gli operatori!) vadano imparate a memoria.
Ho cercato di tagliare le parti piu noiose, spero che sia di facile apprendimento.
Espressioni aritmetiche
Definizione di espressione aritmetica: è un insieme di variabili, costanti e funzioni connessi da operatori aritmetici. Il risultato di unespressione aritmetica è SEMPRE un valore numerico.
Allinterno delle espressioni aritmetici bisogna sempre tenere ben presente che gli operatori e le parentesi non devono essere disposti a caso. Tutto segue una rigorosa gerarchia che deve essere rispettata, pena il malfunzionamento del programma.
Ecco quindi la gerarchia degli operatori aritmetici.
1. negazione ( - )
2. moltiplicazione ( * ) , divisione ( / ), modulo (%)
3. somma ( + ), sottrazione ( - )
4. assegnamento ( = )
Faccio un esempio:
Se y = 8, lespressione -y sara uguale a -8
Mentre:
2 * - ( y - 9 ) sarà uguale a +2
Allinterno delle espressioni aritmetiche, la priorità degli operatori segue le regole dellalgebra (ed ecco perché vi ho consigliato quei libri :-), nel secondo caso viene applicata la regola meno per meno fa piu.
A livello di compilatore, la valutazione delle espressioni avviene esaminandola da sinistra a destra piu e piu volte. Le prime ad essere eseguite sono le operazioni di negazione , quindi lespressione è esaminata nuovamente per eseguire tutte le moltiplicazioni, divisioni e le operazioni modulo (%). Lultima scansione esegue le addizioni e le sottrazioni. Nel C si usano solo le parentesi tonde nelle espressioni (le graffe sono usate altrove nei listati). Vengono valutate per prime le operazioni allinterno delle parentesi tonde piu interne.
NB: attenzione a non confondere il simbolo di assegnamento ( = ) con quello di uguaglianza ( == ).
Infatti, come visto si usa il simbolo di assegnamento ad esempio per attribuire un valore ad una variabile:
y = 9;
Mentre, se dobbiamo fare un confronto (supponiamo tra una variabile e un numero),
con lutilizzo di un concetto di uguaglianza quindi, con un istruzione del tipo: se x è uguale a 2 allora scrivi esatto scriveremo:
if( x == 2)
printf(esatto);
Espressioni logiche e operatori relazionali
Unespressione logica genera come risultato un valore VERO (1) o FALSO (0) . Da ricordare che qualsiasi valore diverso da zero verrà considerato VERO.
Un semplice esempio di espressione logica puo essere quello di una variabile, il cui valore puo essere considerato vero, se diverso da zero, falso se uguale a zero.
Per confrontare i valori allinterno di unespressione logica utilizziamo gli operatori relazionali, cioè: > (maggiore di), >= (maggiore o uguale), < (minore di), <= (minore o uguale), == (uguale a), != (diverso da).
La gerarchia di questi operatori è la seguente:
1. > (maggiore di), >= (maggiore o uguale), < (minore di), <= (minore o uguale)
2. == (uguale a), != (diverso da)
Come avrete notato i primi quattro operatori hanno la medesima priorità che è maggiore
solo a == e a != , gli ultimi ad essere trattati in unespressione logica.
Per capire meglio, prendiamo lespressione:
a<b == x>z
il compilatore valuta prima le espressioni a<b e x>z poiché come detto < e > hanno priorità maggiore. Solo successivamente verrà valutata lespressione nel suo insieme
(a<b) == (x>z)
Eccone lapplicazione in un listato:
#include <stdio.h>
main()
{
int x = (5*5*5)/5 ;
if(x) printf("x è diverso da 0");
}
Analizziamo la variabile x , il Mac, una volta eseguita loperazione (5*5*5)/5, che risulta 25, attribuira a x il valore 5. Poniamo un if per il confronto dellespressione logica, che in questo caso è semplicissima (x = 5). Questa espressione è VERA (1) poiché il suo valore è diverso da zero. Cosi il Mac passerà allesecuzione del comando printf.
Il contrario accade nel listato che segue. X risulterà valere zero, e il comando printf preceduto dallif non verrà mai eseguito in quanto lespressione è FALSA (0).
#include <stdio.h>
main()
{
int x = ((5*5*5)/5)*0 ;
if(x) printf("x è diverso da 0");
}
Gli operatori logici
Un gruppo di espressioni logiche puo inoltre essere concatenato mediante gli operatori logici. Essi sono in grado di negare il risultato di unespressione logica. In ordine di priorità abbiamo:
1. ! (NOT logico)
2. && (AND logico)
3. || (OR logico)
Questultimo si noti che non é composto da due I maiuscole. Per ottenere il simbolo premere alt - slash (/).
Ecco come operano questi operatori nella seguente tabella della verità. Ecco concatenate due espressioni x e y.
| x | y | x&&y | x||y | !x |
| 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 |
Partiamo dal connettivo AND (&&). Esso restituisce VERO se e solo se il valore di entrambe le espressioni è VERO.
Il connettivo OR (||) restuisce VERO se almeno una delle due espressioni logiche è VERA. Restituisce FALSO se entrambe le espressioni sono false.
Infine il loperatore (non è un connettivo, lavora solo su una espressione) NOT (!) nega sempre il valore di unespressione, infatti se x è FALSA restituisce VERO e viceversa.

