Visualizzazione dei risultati da 1 a 10 su 14

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

Hybrid View

  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
    Ottima osservazione LeleFT, ma l'esempio che hai fatto mi sembra molto più leggibile usando il label, sono del parere che quando un costrutto/funzione/altro è inutile o inconveniente non viene nemmeno implementata ne in java ne in altri linguaggi quindi escludere lo studio di alcune cose penso sia una brutta mossa... Dico questo perché il post in questione mi ha fatto conoscere l'esistenza del label e la cosa mi ha gratificato molto...

    LeleFT, sicuramente non sono ne mi ritengo un esperto quindi mi piacerebbe sapere la tua su quello che penso ciao ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Feb 2012
    Messaggi
    55
    Ciao LeleFT,
    grazie del chiarimento, davvero esplicativo.
    Ho deciso di fare l'esame OCA di Java e sto cercando di capire più argomenti possibili......a proposito hai qualche consiglio sull'esame?

    bb

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    L'esempio che ho fatto, e l'ho detto, è troppo banale per poterne apprezzare la differenza.
    Ma supponi di avere un codice più corposo (con dentro diverse if / if-else, cicli for, switch, ecc): l'uso di una variabile (magari con un nome più significativo di quello che ho usato io; l'esempio aveva un altro scopo) rende il tutto più leggibile e manutenibile. Senza contare che se cominci a piazzare label in giro per il codice, alla fine non ti capisci più (ritorni ad avere codice simil-spaghettaro, che è stata la causa di molti mali già in passato).

    Ripeto: conoscere che esiste va bene; limitarne l'uso va bene (io, in più di 15 anni di programmazione Java, non ne ho mai usata una...); usarla al posto di ciò che viene considerata "buona programmazione" alla lunga è deleterio. Per dirti, ho spulciato molti sorgenti della libreria standard di Java... e non l'ho mai vista usare nemmeno da loro


    Edit: ne ho trovato traccia all'interno della classe String del JDK 1.6, in toUpperCase() e toLowerCase().


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

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.