ASSEGNAZIONE COME ESPRESSIONE

Nel linguaggio C l'assegnazione è in realtà un'espressione come le altre, e quindi ha un valore; d'altra parte la sua valutazione corrisponde ad eseguire l'assegnazione e quindi a modificare il contenuto di una variabile.
IDENTIFIER = EXPRESSION
è un'espressione la cui valutazione cambia anche il contenuto di IDENTIFIER assegnandogli il valore di EXPRESSION; il valore di questa espressione è il valore finale di IDENTIFIER.

Un'espressione come sopra diventa uno statement se è seguita dal punto e virgola.

Per esempio, il seguente programma

#include <stdio.h>

main(){
    int x = 9, y = 8 ;
    
    y = ( x = 5 ) + 3 ;         
    printf("x = %d e y = %d.\n",x,y);

    y = ( x == 5 ) + 3 ;         
    printf("x = %d e y = %d.\n",x,y);
}
produrrà il seguente output
x = 5 e y = 8.
x = 5 e y = 4.
Utilizzare questo costrutto con attenzione, poichè è molto facile fare errori (la seconda parte del programma sopra potrebbe benissimo essere il risultato di aver scritto = invece di ==).
Inoltre le idee ''espressioni rappresentano valori, gli statement sono azioni'' sono più pulite dal punto di vista concettuale e ciò aiuta a scrivere programmi più chiari, e quindi più facilmente corretti.

ESEMPIO

Scrivere un programma che legge dei numeri interi fino a che non riceverà un numero negativo, e poi stampa la loro somma.
#include <stdio.h>

int E_Cifra(char c);
/*controlla se un carattre e' una cifra decimale*/

int ReadInt(void);
/*legge un numero intero scritto nel formato segno sequenza di cifre */

main(){
    int num, somma = 0 ;
    
    while((num = ReadInt()) >= 0)
       somma = somma + num;
    printf("La somma e\' %d .\n",somma);

}

int E_Cifra(char c)
{
    return (c >= '0') && (c <= '9');
}

int ReadInt(void)
{ 
    char segno, cif;
    int num = 0;
    
    scanf("%c",&segno);
    if((segno == '+') || (segno == '-')){
       scanf("%c",&cif);
       while(E_Cifra(cif)){
          num = (num * 10) + (cif - '0');
          scanf("%c",&cif);
       };
       return((segno =='+') ? num : -num);
    }
    else { printf("ERRORE\n");
           return -1;
         }
}
Questo programma può anche essere scritto con costrutti più standard modificando il suo main come segue
main(){
    int num, somma = 0 ;
    
    num = ReadInt();
    while(num >= 0){
       somma = somma + num;
       num = ReadInt();
    };
    printf("La somma e\' %d .\n",somma);

}

ESERCIZIO

  1. Modificare i programmi visti precedentemente utilizzando, quando possibile, la dualità del C tra espressioni e statement di assegnazione.