Pattone ha scritto:
Volevo ringraziarti per non avermi insultato data la stupidità del problema ma a questo punto mi sorge un dubbio.
Nella parte di codice "if (f==10 || s==10 || p==10 || g==10)" se invece che mettere == metto = il programma mi da errore di sintassi ma perché dove dici tu prende il significato di assegnazione l'= e non di errore? e poi perché funziona nei casi precedenti mentre nel quarto no?
L'istruzione di assegnazione (in C come in C++ come in altri linguaggi) è un'operazione che è vista anche come un'espressione. Il valore di tale espressione è uguale al valore che viene assegnato alla variabile (cioè, il valore di ciò che sta a destra dell'uguale) e viene sempre valutata da destra verso sinistra.
Esempietto:
int a = 0;
int b = 10;
int c = 11;
a = b + c;
Con l'istruzione di assegnazione che c'è alla fine del listato, alla variabile "a" viene assegnato il valore dell'espressione che sta a destra dell'uguale. L'espressione viene quindi valutata da destra verso sinistra: prima viene valutata "c", poi viene valutata "b", quindi viene fatta la somma e il risultato viene assegnato alla variabile "a".
L'intera espressione quindi ha valore 21.
In C / C++ tutte le espressioni di tipo intero sono valutate in modo booleano a seconda del loro valore: se valgono 0 sono interpretate come FALSO, altrimenti sono sempre interpretate come VERO.
Questo significa che all'interno della guardia dell'istruzione if (ma anche del while o del for, ecc) posso scrivere qualsiasi espressione che sia valutabile come numero intero.
Detto questo, bisogna capire cosa hai scritto in quell'espressione perchè ti venga dato errore di sintassi. La seguente istruzione, infatti, è perfettamente lecita (seppur semanticamente sbagliatissima):
if ((f=10 || s=10 || p=10 || g=10)) { ... }
Quel che accade è che "inaspettatamente" il valore della variabile "f" verrà impostato a 10, mentre le variabili "s", "p" e "g" non verranno toccate. Questo, però, ha a che fare con la short-circuit evaluation (che ti consiglio di studiare).
Non avevo visto gli altri casi in cui hai commesso lo stesso errore (assegnazione invece di confronto). Non capisco cos'è che non ti torna del funzionamento.
Ciao.