Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Zeldic
    Registrato dal
    Jan 2010
    Messaggi
    80

    [C/C++] Esercizio Scope dinamico

    Ciao, ragazzi! Sto facendo una serie di esercizi sullo scope statico e scope dinamico, ma credo di non aver compreso perfettamente la differenza su alcuni punti.
    Ad esempio, ho provato a svolgere il seguente esercizio, il più semplice. Potete controllare per favore se ho inserito i valori corretti (nei commenti)?
    Questa è la traccia :


    Si dica cosa viene stampato dal seguente frammento di codice scritto in uno pseudolinguaggio che usa scope dinamico e passaggio per riferimento.

    codice:
    {int x = 1;
     int y = 1;
     void pippo(reference int z){
         z = x + y + z;
     }
     {int y = 3;
       {int x = 3;    // Secondo me, questo blocco viene ignorato, perché é mascherato da x = 1; 
       }
       pippo(y);      //  --->  y = 5
       write(y);      //  --->  Stampa a video 1  (ma non ne sono sicura)
     }
     write(y);        //  --->  Stampa 1
    }
    Inoltre non ho ancora ben capito cosa mi cambia ai fini del risultato se il passaggio avviene per riferimento, anziché per valore, quali valori otterrei? Per me, sempre riferendomi a questo esercizio, il risultato non cambierebbe..

  2. #2
    Intanto indenta il codice decentemente, aiuta un sacco. Poi, la parola chiave "reference" non esiste, i reference in C++ si indicano con la &
    codice:
    {
        int x = 1;
        int y = 1;
        void pippo(int & z)
        {
            z = x + y + z;
        }
        {
            int y = 3;
            {
                int x = 3;
            }
            pippo(y);
            write(y);
        }
        write(y);
    }
    Poi, la regola di base è facilissima: la variabile che viene presa in considerazione (se ce n'è più di una con lo stesso nome) è quella dichiarata nel blocco più interno (ma non più interno del blocco in cui ci si trova)
    codice:
    {
        int x = 1;
        int y = 1;
        void pippo(int & z)
        {
            // gli x e y a cui ci si riferisce qui sono quelli che valgono 1
            z = x + y + z;
        }
        {
            int y = 3;
            {
                // questa variabile muore alla chiusura della graffa, quindi ai nostri fini non ci interessa
                int x = 3;
            }
            pippo(y); // a pippo viene passato un riferimento a y=3
            // y ora vale 1 + 1 + 3 = 5 (=> pippo)
            write(y); // viene stampato 5
        }
        write(y); // l'y a cui ci si riferisce ora è quella che vale 1
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it L'avatar di Zeldic
    Registrato dal
    Jan 2010
    Messaggi
    80

    Originariamente inviato da MItaly
    Intanto indenta il codice decentemente, aiuta un sacco. Poi, la parola chiave "reference" non esiste, i reference in C++ si indicano con la &

    Ciao, MItaly!! Sì, l'ho copiato tale e quale dal mio testo di Linguaggi.. Nel titolo ho scritto C/C++ per inserire qualcosa, ma sto trattando per ora solo pseudolinguaggi giusto per capire i concetti di scope.



    Poi, la regola di base è facilissima: la variabile che viene presa in considerazione (se ce n'è più di una con lo stesso nome) è quella dichiarata nel blocco più interno (ma non più interno del blocco in cui ci si trova)

    Correggimi se sbaglio, non capisco ancora : ma non è questa la regola dello Scope statico, invece? Qui il mio testo riporta : scope statico, o regola dello scope annidato più vicino (in senso spaziale); scope dinamico, o regola dell'associazione più recente (in senso temporale)..



    codice:
    {
        int x = 1;
        int y = 1;
        void pippo(int & z)
        {
            // gli x e y a cui ci si riferisce qui sono quelli che valgono 1
            z = x + y + z;
        }
        {
            int y = 3;
            {
                // questa variabile muore alla chiusura della graffa, quindi ai nostri fini non ci interessa
                int x = 3;
            }
            pippo(y); // a pippo viene passato un riferimento a y=3
            // y ora vale 1 + 1 + 3 = 5 (=> pippo)
            write(y); // viene stampato 5
        }
        write(y); // l'y a cui ci si riferisce ora è quella che vale 1
    }

    Infine, perché la prima occorrenza della write() stampa il valore 5, anziché 1? Forse per il fatto che stiamo considerando il riferimento ad y? Se l'esercizio invece mi avesse richiesto il passaggio per valore e quindi la stampa di y, avrebbe stampato 1, dato che y = 1 sopra? Grazie ancora.

  4. #4
    Dato che hai scritto C/C++ io ti ho descritto le regole dello scope in C/C++, che effettivamente sono quelle dello scope statico.
    Purtroppo (o per fortuna ) Non ho mai lavorato con linguaggi che hanno scoping dinamico né ho mai studiato nulla a riguardo, per cui su quello non ti so aiutare.
    Amaro C++, il gusto pieno dell'undefined behavior.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.