PDA

Visualizza la versione completa : [Java] Esercizio


JunkyFunki
14-01-2004, 19:19
int age=64;
boolean birthday=true;
if ((birthday==false)&& age-- >=64);
System.out.println(age);
if ((birthday==false)& age-- >=64);
System.out.println(age);



xch in uscita visualizza 64 e 63 e non 64 64???

&& non un operatore AND?
ed essendo birthday=true non li deve saltare entrambi?

:master:

Xadoom
14-01-2004, 19:37
Leva il ; dopo le istruzioni IF..... ;)

LeleFT
14-01-2004, 19:41
Osserva cosa hai fatto:
nella seconda if hai scritto una & in meno. In questo modo viene interpretata una cosa del genere:

(birthday == false) un'espressione che ha valore FALSE
(age-- >= 64) un'espressione che ha valore FALSE
l'operatore & bit a bit fa una AND fra uno 0 e uno 0 restituendo 0, quindi l'espressione nella guardia dell'if FALSA. Ma l'operazione age-- VIENE ESEGUITA per poter valutare l'espressione.

Nel primo caso, invece, una concatenazione logica di AND: l'if termina con false non appena uno qualsiasi dei suoi operandi falso, cio il primo. Non viene valutato il resto dell'espressione.

Cosa succede, quindi: viene valutata (birthday == false) risulta falsa e l'if TERMINA SUBITO, senza valutare il resto. Stampa, quindi, l'et 64.

Dopo viene valutata la seconda IF. Qui viene valutato il primo termine ed un false. Poi viene valutata la seconda espressione (non c' una concatenazione di AND (&&) ma un operazione bit per bit!) e viene eseguita age--. E' falsa, quindi il risultato finale falso, esce dall'if e stampa age, che ora vale 63.

Ciao.

JunkyFunki
14-01-2004, 21:06
Originariamente inviato da LeleFT
Osserva cosa hai fatto:
nella seconda if hai scritto una & in meno. In questo modo viene interpretata una cosa del genere:

(birthday == false) un'espressione che ha valore FALSE
(age-- >= 64) un'espressione che ha valore FALSE
l'operatore & bit a bit fa una AND fra uno 0 e uno 0 restituendo 0, quindi l'espressione nella guardia dell'if FALSA. Ma l'operazione age-- VIENE ESEGUITA per poter valutare l'espressione.

Nel primo caso, invece, una concatenazione logica di AND: l'if termina con false non appena uno qualsiasi dei suoi operandi falso, cio il primo. Non viene valutato il resto dell'espressione.

Cosa succede, quindi: viene valutata (birthday == false) risulta falsa e l'if TERMINA SUBITO, senza valutare il resto. Stampa, quindi, l'et 64.

Dopo viene valutata la seconda IF. Qui viene valutato il primo termine ed un false. Poi viene valutata la seconda espressione (non c' una concatenazione di AND (&&) ma un operazione bit per bit!) e viene eseguita age--. E' falsa, quindi il risultato finale falso, esce dall'if e stampa age, che ora vale 63.

Ciao.

aaaaaaaaahhhhhhhh!ora ho capito! tnx!

Pensavo che faceva solo un controllo del tipo 63>=64 senza modificare la variabile!

Allora se birthday=true visualizza 63 e 62?

Se si, c' un modo per fare un controllo simile senza modificare la variabile?

LeleFT
14-01-2004, 21:16
Se birthday true visualizza 63 e 62.
In che senso "c' un altro modo per fare il controllo senza modificare la variabile"?

Se intendi effettuare un controllo sul valore (age - 1) basta digitarla proprio cos:

if ((birthday == false) && (age - 1) >= 64)...

L'espressione (age - 1) non modifica il valore. L'istruzione age--, invece equivalente alla scrittura age = age - 1;

Se vuoi un consiglio, poi, stilisticamente brutto scrivere un confronto fra espressioni booleane usando l'operatore == con il false.
Si preferisce, anche per maggiore leggibilit, usare la negazione: !

Quindi, il tuo if diverrebbe:

if (!birthday && age >= 64)...

Quando, invece devi confrontare con un true, si usa semplicemente il nome della variabile booleana (o l'espressione): non ha senso, infatti confrontare con true; se l'espressione (o la variabile) ha di per s valore true, allora gi un'espressione VERA, senza doverla confrontare con true; a livello logico, infatti se la variabile birthday true si vedrebbe una cosa del genere:

if (true == true) ed veramente poco elegante (quanto inutile).


Ciao.

JunkyFunki
14-01-2004, 21:36
Originariamente inviato da LeleFT
Se birthday true visualizza 63 e 62.
In che senso "c' un altro modo per fare il controllo senza modificare la variabile"?

Se intendi effettuare un controllo sul valore (age - 1) basta digitarla proprio cos:

if ((birthday == false) && (age - 1) >= 64)...

L'espressione (age - 1) non modifica il valore. L'istruzione age--, invece equivalente alla scrittura age = age - 1;

Se vuoi un consiglio, poi, stilisticamente brutto scrivere un confronto fra espressioni booleane usando l'operatore == con il false.
Si preferisce, anche per maggiore leggibilit, usare la negazione: !

Quindi, il tuo if diverrebbe:

if (!birthday && age >= 64)...

Quando, invece devi confrontare con un true, si usa semplicemente il nome della variabile booleana (o l'espressione): non ha senso, infatti confrontare con true; se l'espressione (o la variabile) ha di per s valore true, allora gi un'espressione VERA, senza doverla confrontare con true; a livello logico, infatti se la variabile birthday true si vedrebbe una cosa del genere:

if (true == true) ed veramente poco elegante (quanto inutile).


Ciao.

Ok!

Usare (age-1) al posto di age-- un truccheto a cui non ho pensato proprio...mar quanto so scemo... :dh:

Riguardo lo stile , un esercizio che ho copiato dal libro!

Tra l'altro non sapevo nemmeno che potevo mettere !var al posto di var=false :eek: , grazie per le dritte! ;)

scolpi
15-01-2004, 21:07
L'operatore & (AND) e l'operatore | (OR) possono essere usati singolarmente o in coppia.
E' noto che l'OR di due valori booleani vero quando almeno uno degli operatori vero, mentre l'And falso quando lo almeno uno dei due;
ricordando poi che java valuta le espressioni da sinistra verso destra, il linguaggio fornisce la possibilit di sfruttare quanto sopra detto cio:
mentre con && (e ||) vengono sempre e comunque valutati entrambi gli operandi, nel caso di & ( |) invece l'operando di sinistra il primo ad essere valutato e se trovato false (true) l'altro operando non viene valutato, in altre parole quest'ultimo metodo pi efficiente. Ciao

LeleFT
15-01-2004, 21:21
E' esattamente il contrario: se noti il codice che ha postato JunkyFunki noterai che nella prima istruzione la parte destra non viene valutata, mentre nella seconda s.

Inoltre gli operatori singoli (&, |) sono operatori bit a bit ereditati dal C++, ed effettuano operazioni sui bit.

Questa funzione, per esempio, ritorna il valore del primo bit meno significativo del numero ad essa passato come parametro:


public int bitMenoSignificativo(int valore) {
return (valore & 1);
}


Ciao. :ciauz:

scolpi
16-01-2004, 13:15
Scusa, hai ragione ho invertito && con & e || con | hai ragione,scusate ragazzi. Ciao.

Loading