Esercizio con gli operatori ?

Messaggioda simonerusso64 » 15/07/2018, 00:58

Codice:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
   int a = 5, b = 3, c = 0;
   if (!b--&&++a || !c-- % 2 == 0) c -= 3 * a;
   else if (!(a % 2 == 0) || ((b++) && (a--))) a--; b++;
   switch (++b - c) {
   case 0: printf("%d - ", a);
   case 1: printf("%d - ", b); break;
   case 2: printf("%d - ", c);
   default: printf("%d", a);
   }
}



Devo trovare il valore stampato da questo programma. Ora io sto provando a risolverlo passo passo con il debug su Visual Studio. Analizzando i valori al primo if mi viene a = 5, b= 2, c=-1. Con b mi trovo, ma perchè a= 5 e c=-1 ? Non dovrebbe essere a = 6(visto che viene incrementato) e c=-16 ?
simonerusso64
Junior Member
Junior Member
 
Messaggio: 56 di 212
Iscritto il: 30/10/2017, 22:44

Re: Esercizio con gli operatori ?

Messaggioda Super Squirrel » 16/07/2018, 08:56

Quando si utilizza &&, il secondo operando (quello a destra di &&) viene valutato solo se il primo operando restituisce vero.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 249 di 1486
Iscritto il: 16/05/2013, 22:05

Re: Esercizio con gli operatori ?

Messaggioda apatriarca » 16/07/2018, 09:31

Gli operatori && e || eseguono l'espressione alla loro destra solo se necessario. Nel caso di && l'espressione destra viene eseguita solo se quella a sinistra è vera, nel caso di || se l'espressione è falsa. Siccome !b-- è falsa (3 è non nullo e quindi vero e il ! la fa diventare falsa) l'istruzione alla destra non viene valutata. A questo punto viene eseguita l'istruzione a destra dell'|| che è falsa e quindi il corpo dell'if non viene valutato. Alla fine b viene quindi decrementato, a rimane uguale a se stesso (perché la relativa istruzione non viene eseguita) e c viene decrementato di 1.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5069 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Esercizio con gli operatori ?

Messaggioda simonerusso64 » 16/07/2018, 11:52

Ma l'istruzione a destra dell'|| perchè è falsa ? Io ho !c--%2 == 0, quindi c=0, che viene decrementato e diventa -1, poi diventa non -1, quindi 0 e 0%2 è 0. Quindi alla fine si ottiene 0==0 che è 1 e quindi vera.
simonerusso64
Junior Member
Junior Member
 
Messaggio: 58 di 212
Iscritto il: 30/10/2017, 22:44

Re: Esercizio con gli operatori ?

Messaggioda apatriarca » 16/07/2018, 12:01

Il valore viene modificato dopo essere stato usato. Se fosse stato scritto !--c avresti avuto ragione, ma così c vale ancora 0 e quindi quando viene negato diventa 1. Dopo aver valutato la tua istruzione c viene decrementato.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5070 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Esercizio con gli operatori ?

Messaggioda simonerusso64 » 16/07/2018, 12:14

Ok quindi ora dovrei fare prima 1%2 e poi decrementarlo.
1%2 = 0 che decrementato diventa -1. -1==0 che è falso. Giusto ?
simonerusso64
Junior Member
Junior Member
 
Messaggio: 60 di 212
Iscritto il: 30/10/2017, 22:44

Re: Esercizio con gli operatori ?

Messaggioda apatriarca » 16/07/2018, 12:21

No, l'unico valore di c che interviene nella condizione dell'if è quello iniziale. Quindi 0. Il fatto che sia decrementato dopo non ha alcun effetto sulla condizione.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5071 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Esercizio con gli operatori ?

Messaggioda simonerusso64 » 17/07/2018, 00:36

Perchè alla fine viene stampato 4 come risultato ?
simonerusso64
Junior Member
Junior Member
 
Messaggio: 62 di 212
Iscritto il: 30/10/2017, 22:44

Re: Esercizio con gli operatori ?

Messaggioda apatriarca » 17/07/2018, 00:42

Perché subito prima dello switch abbiamo a=4, b=3 e c=-1. Il numero che viene considerato nello switch ha valore 5 essendo b incrementato prima di ottenere il valore dell'espressione. 5 va a finire in default e quindi viene stampato il valore di a che è 4.
apatriarca
Moderatore
Moderatore
 
Messaggio: 5072 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Esercizio con gli operatori ?

Messaggioda simonerusso64 » 17/07/2018, 00:53

Ma quindi anche se il primo corpo dell'if risulta falso, i valori delle variabili dell'else if non sono più quelli iniziali, ma quelli che che derivano dal primo if ?
simonerusso64
Junior Member
Junior Member
 
Messaggio: 63 di 212
Iscritto il: 30/10/2017, 22:44

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite