Espressioni con operatori ?

vincenzoj
(x == 2 || x-- == -1 && !(y - x) >= 0) && ((y > x-- ? x : y--) == y < x)


[1] y=1; x=3
[2] y=0; x=2
[3] y=1; x=2

Risposta : [3]

Io ho :
2==2 vero
Valuto quindi :
&& ((y > x-- ? x : y--) == y < x)
1>2 falso, quindi ho y--
(y--)==y 1(che decrementerò alla fine)==1<1(che ho decrementato precedentemente)
Ma 1<1 è falso, quindi 0.
Alla fine ho 1==0 che è falso.

Quindi dov'è che sbaglio ?

Risposte
vict85
Qual è la domanda? E quali sono i valori iniziali delle variabili?

vincenzoj
La traccia dell'esercizio è la seguente :
Data una coppia di interi (y, x), indicare per quali valori di (y, x) la seguente espressione risulta vera.

vict85
Personalmente trovo che al tuo professore piaccia mettere in difficoltà gli studenti.

Supponiamo che si abbia [inline]x == 2[/inline] e [inline]y == 1[/inline]. Allora [inline]x == 2[/inline] è vero e quindi anche [inline](x == 2 || x-- == -1 && !(y - x) >= 0)[/inline] è vero. I valori di [inline]x[/inline] e [inline]y[/inline] non sono cambiati.
Quindi [inline]y[/inline] è minore di [inline]x[/inline], quindi la il blocco ritorna [inline]y[/inline] (ovvero [inline]1[/inline]) e diminuisce [inline]y[/inline] e [inline]x[/inline] di \(\displaystyle 1 \). Siccome [inline]y[/inline] è ancora minore di [inline]x[/inline] si ha [inline]1 == true[/inline], che è vero.

vincenzoj
Non ho ancora capito come valuti questa espressione :

((y > x-- ? x : y--) == y < x)


Io ho un'espressione condizionale, che risultando falsa, considero solo y-- e decremento la x portandola a 1 .
Ora ho (y--)==y Ma y

vict85
Questi due codici sono equivalenti:
bool test1(int x, int y) {
    return ((y > x-- ? x : y--) == y < x);
}

bool test2(int x, int y) {
    int value1 = (y > x-- ? x : y--);
    return value1 == y < x;
}

vincenzoj
Ok, allora se ho capito bene la situazione è questa :
value1=y-- (quindi assegno a value1 il valore 1 e poi decremento la y, portandola a 0)
Ora ho :
value1 == 0<1 ( poichè ho decrementato anche la x precedentemente) , quindi 0<1 è vero
1=1

Giusto ?

vict85
Si, è così.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.