Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [Java] Esercizio

  1. #1

    [Java] Esercizio

    codice:
      
     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:
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  2. #2
    Utente di HTML.it L'avatar di Xadoom
    Registrato dal
    Dec 2002
    Messaggi
    1,491
    Leva il ; dopo le istruzioni IF.....
    Windows Xp
    [Java]
    [PHP]Notepad++
    [Fortran90-77] elf90 g77
    [C++ /WinAPI] DevC++ VisualC++

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    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?
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    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.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    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...

    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 , grazie per le dritte!
    E' tutta colpa di Berlusconi !
    Help [Ciclico] Fisco, domande varie

    Avatar

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    23
    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

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    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:
    codice:
    public int bitMenoSignificativo(int valore) {
       return (valore & 1);
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2003
    Messaggi
    23
    Scusa, hai ragione ho invertito && con & e || con | hai ragione,scusate ragazzi. Ciao.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.