Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14

Discussione: ....un ciclo strano...

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    55

    ....un ciclo strano...

    ...ragazzi mi sono imbattuto in un codice che finora non ho mai visto....spero qualcuno me lo possia spiegare....

    codice HTML:
    public class BreakTest{
    public static void main(String[] args){
       int i = 0, j = 5;
       lab1 : for( ; ; i++) {
       for( ; ; --j) if( i >j ) break lab1;
      }
    System.out.println(" i = "+i+", j = "+j);
    }
    }

  2. #2
    Molto semplicemente for(;; i++) e for(;;--j) sono due cicli infiniti (che però incrementano e decrementano a ogni iterazione le relative variabili).
    Il costrutto: if( i >j )break lab1; fa in modo che quando i diventa maggiore di j il primo ciclo, e quindi pure quello al suo interno, viene fermato grazie all'utilizzo del label break lab1;

    per saperne di più sui label questo link porta alla documentazione http://docs.oracle.com/javase/specs/....html#jls-14.7




    Inoltre puoi notare che il primo ciclo viene eseguito solamente una volta ed è messo lì solamente per confondere le idee
    Ultima modifica di cataDesign; 15-07-2014 a 17:47 Motivo: Nota aggiunta

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    55
    ...sinceramente ci ho capito poco...

    bb

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    La teoria l'hai studiata?

    Comunque se il ciclo lo scrivi con un minimo di formattazione seria diventa più chiaro:

    codice:
        public static void main(String[] args) {
            int i = 0;
            int j = 5;
            
            lab1: 
            for (;; i++) 
            {
                for (;; --j) 
                {
                    if (i > j) 
                    {
                        break lab1;
                    }
                }
            }
    
            System.out.println(" i = " + i + ", j = " + j);
        }

    Il ciclo esterno incrementa i
    Il ciclo interno decrementa j
    Al suo interno, se i > j fa tornare l'esecuzione a prima del ciclo.


    Se è un esercizio ok, ma spero che nessuno scriva mai davvero del codice così.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    fa tornare l'esecuzione a prima del ciclo.
    No, il break non funziona come un GOTO (altrimenti, in questo caso, si avrebbe un bel ciclo infinito).

    Il break fa terminare il ciclo denotato dall'etichetta "lab1".

    Più in generale, il break trasferisce l'esecuzione all'istruzione (o blocco di istruzioni) denotato dall'etichetta e questa istruzione (o blocco di istruzioni) termina immediatamente. Quindi, è come se il controllo fosse trasferito all'istruzione immediatamente (logicamente) successiva a quella denotata dall'etichetta.


    Concordo sul non scrivere codice di quel tipo, che rende tutto di più difficile manutenzione.


    Ciao.
    Ultima modifica di LeleFT; 17-07-2014 a 13:28
    "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
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    No, il break non funziona come un GOTO (altrimenti, in questo caso, si avrebbe un bel ciclo infinito).

    Il break fa terminare il ciclo denotato dall'etichetta "lab1".
    D:

    mea culpa, non avendolo mai usato ho pensato al comportamento più intuitivo ^^'
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    non avendolo mai usato ho pensato al comportamento più intuitivo ^^'

    Tranquillo, mai usato neppure io... e ogni volta che vedo cose di questo genere devo andarmi a rileggere la JLS.


    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

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    55
    Ciao,
    il codice l'ho preso da un libro, e purtroppo è scritto proprio così.....volevo capire meglio le label visto che non si utilizzano molto.

    bb

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da blubossa Visualizza il messaggio
    Ciao,
    il codice l'ho preso da un libro, e purtroppo è scritto proprio così.....volevo capire meglio le label visto che non si utilizzano molto.

    bb

    E' vero che non si utilizzano molto e, se non si usano molto, un motivo c'è.
    Ed è proprio il fatto che rendono meno "strutturato" il codice (o, meglio, rendono più difficile seguire il filo logico del programma).
    Ad ogni modo, una label serve ad etichettare un'istruzione (o un blocco di istruzioni) in modo tale che quell'istruzione (o blocco) possa essere terminata forzatamente tramite l'uso di un break.
    Se ne può tranquillamente fare a meno (e, in generale, è meglio farne a meno), quindi, se non per scopi puramente "informativi" (del tipo: so che ci sono, so come funzionano e non le userò mai), ti consiglierei di saltare a pié pari l'argomento e non darci troppo peso.


    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

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Aggiungo ancora una cosa, per far capire che le label possono tranquillamente essere evitate se non si necessita di avere "migliori performances" in ambiente critico.


    codice:
    miaLabel:
    while( condizione ) {
       while( altra_condizione ) {
          if (condizione3 ) break miaLabel;
          ...
       }
    }

    C'è un ciclo while. All'interno del ciclo while, c'è un secondo ciclo while. Se dentro al while più interno viene verificata una determinata condizione (condizione3) allora viene terminato il ciclo while più esterno (ed, ovviamente, anche il relativo ciclo interno).
    Questo codice può essere riscritto, in modo più chiaro e lineare, in questo modo:


    codice:
    boolean flag = true;
    while(flag && condizione) {
       while(flag && altra_condizione) {
          if (condizione3) {
             flag = false;
          } else {
             ...
          }
       }
    }

    E' meno performante, poichè il break fa terminare immediatamente e forzatamente tutto, mentre in questo modo, verrebbe prima ri-analizzata la condizione del while interno (che terminerebbe), quindi ri-analizzata la condizione del while esterno (che terminerebbe). Però il secondo blocco di codice permette di seguire più facilmente il flusso logico del codice (l'esempio è troppo banale per rendersene conto, ma se il corpo dei due while fosse più complesso, le cose cambierebbero).
    Si dovrebbe sempre preferire un codice "facile e manutenibile", laddove le performances non giochino un ruolo altamente essenziale. Come ogni cosa, non c'è solo il lato buono o il lato cattivo: sono le cattive abitudini (e l'abuso), in genere, a creare codice di dubbia qualità.


    Ciao.
    Ultima modifica di LeleFT; 24-07-2014 a 13:04
    "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

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.