Episodio 23 del corso di C++, oggi dobbiamo parlare dello scope delle variabili. Che cos'è? Oh mio Dio, che parolone incredibile!
Ma al momento è opportuno perché abbiamo visto anche le funzioni, quindi abbiamo arricchito ulteriormente la nostra conoscenza di C++ e dobbiamo appunto parlare delle variabili. Abbiamo visto che ci sono diversi tipi di variabili. Se ad esempio prendiamo una funzione, facciamo void, insomma così in realtà... Dovrebbe restituire un int, ma pazienza, abbiamo la nostra somma.
Qua possiamo avere ad esempio dei parametri, int x e int y. Qua dentro potremmo avere poi un'altra variabile, quindi variabile chiamiamola funzione. Funzione, tac, e potremmo assegnarla a 5 per assurdo.
Poi potremmo fare un'operazione e fare il return di... di qualcosa fate quello che volete ma non è importante in sé la funzione è importante xy è importante variabile funzione e quant'altro abbiamo visto che possiamo creare variabili qua dentro perciò potremmo avere un int variabile main giusto per far capire dove siamo che è uguale a ad esempio 30 così oppure potremmo avere qua in alto fuori dal main Quelle che si chiamano variabili globali e hanno motivo perché si chiamano variabili, mentre invece queste qua dentro, non ve l'ho ancora detto, ma si chiamano variabili locali. Quindi potremmo creare un int variabile globale uguale a 90. Perfetto. Inoltre possiamo creare anche blocchi di codice senza if o quant'altro, quindi potremmo creare banalmente un blocco di codice semplicemente con le due parentesi graffe. E qua dentro potremmo avere int variabile blocco.
che è uguale a 5, tac, e perché no potremmo avere anche un if, ad esempio if 5 minore di 10 per assurdo, io non ho fatto minore, ho fatto z, ecco qua, quindi minore, e potremmo avere anche qua int variabile if uguale a 10. Quindi avete visto che ho preparato una zona con un po'di variabili, ma fondamentalmente la distinzione è tra due tipi di variabili, globale, Quindi variabile qua in alto, dentro nessun blocco di codice, quindi che sia funzione, blocco di codice, eccetera, fuori dal main. Dopodiché abbiamo variabili locali, quindi sono locali rispetto a cosa? Sono locali rispetto alla funzione, quindi al blocco di codice. Lo vedete che questo è un blocco di codice con le parentesi graffe della funzione. Variabile locale rispetto alla funzione main, variabile locale rispetto al blocco.
che fa parte di main, variabile locale che fa parte del blocco di codice if. Cominciamo a vedere come funziona tutta sta roba perché si chiamano globali e locali. Se già capite il senso, ciò che è globale è accessibile ovunque, è globale vale per tutti. Ciò che invece è locale è della propria zona.
Ad esempio, McDonald è globale, perché? Perché McDonald è quasi accessibile ovunque in tutto il mondo. Mentre invece la panetteria che avete sotto casa è quasi al 99,9% una panetteria locale, c'è solo lì, il pane buono è quello, lo fanno loro, non hanno altre sedi, quindi è locale a casa vostra. Se già abitate a 5 km di distanza, molto probabilmente non andate a quella panetteria. Potreste andarci, però in realtà le variabili locali non è che potete accederci così come volete, quindi questa è una piccola eccezione.
Però andiamo oltre Quindi se io faccio std 2 punti 2 punti Cout E provo a mandare a schermo da qua Variabile globale In realtà per voi non ha Non fa molta differenza perché Perché in realtà non ve l'ho mai spiegata sta cosa Perciò per voi dice Ah vabbè stai inserendo una variabile Che è là in alto Scusatemi End line Col punto e virgola E manca un 2 punti Salvo Allargo un pochino Mando a schermo E vedete che abbiamo il nostro 90 Perché? Perché variabile globale Fa riferimento qua ed è 90 Perfetto, nessun problema Se prendo questo qua e lo metto qua dentro nell'if Vediamo un po', sono dentro ad un blocco di codice Eppure me lo dà lo stesso Lo casso da qui, lo inserisco magari in questa funzione Salvo, faccio play E giustamente non me lo manda a schermo perché non ho chiamato la funzione somma Andiamo a chiamare somma Mettiamo dentro due valori a caso giusto perché è obbligatorio Salvo, mando a schermo E vedete che ottengo 90 Anche in questo caso Quindi la variabile globale È una variabile che si trova fuori da main Che è qua in alto Quindi allo stesso livello di include Allo stesso livello di using Ed è lì Ed è accessibile praticamente ovunque All'interno del file Lo vedete Dopo Dopo che abbiamo le variabili locali, le variabili locali sono appunto locali a quel blocco di codice. Mi spiego meglio, proviamo a mandare a schermo variabile funzione, quindi io sono qui, sono dentro la mia variabile funzione, salvo, ho tolto somma, mannaggia me, quindi faccio ancora somma da qua, butto dentro 0 e 0, tanto non mi interessa 0 e 0, punto e virgola, faccio play e ottengo 5, perché 5 è la mia variabile funzione, meglio cambiare questa in 105. Perché sennò sono duplicati. Quindi ho la mia variabile funzione che accedo da qua dentro e mando a schermo. Altra cosa, mettiamo x che è il parametro che fa riferimento a questa funzione.
Quindi dentro qua ho x che viene tra virgolette attivato o riempito grazie a questo 0, ma chiama questa funzione perciò sono qui. Ho la mia x, se faccio play, vediamo un po', ho 0 a schermo. Perfetto, nessun problema.
Proviamo a prendere le stesse due variabili, quindi variabile funzione e x, proviamo a mandarla a schermo all'interno di main. Non avendovi spiegato niente, qualche minuto fa potevate dirmi, eh ma perché non va? Adesso probabilmente avrete capito perché non va. Quindi la funzione non ci interessa più al momento tanto l'abbiamo già vista e vedete che ho già un problema, x non me la trova.
x non me la trova perché è definita in questo blocco di codice, non è globale, è definita qua dentro. dentro queste due parentesi graffe di conseguenza è locale ad uso stretto di cosa? di questa funzione proviamo a prendere variabile funzione perché vabbè qua c'è la x ok è un parametro però magari se faccio così variabile funzione non me la trova lo stesso voi direte eh Ido ma non hai chiamato la funzione proviamo a chiamare la funzione mettiamo 0,0 punto e virgola e non succede assolutamente niente vedete che non riesce a trovarlo perché? perché variabile funzione la cerca Qua dentro e al di fuori di questo blocco Quindi qua in alto se io andassi a fare così Variabile funzione metto 555 Salvo, faccio play, mi manda a schermo 555 Non questa variabile funzione Ma questa variabile funzione Perché è quella globale Questa qui non viene neanche conteggiata Quindi togliamo questa variabile funzione E vedete che torniamo ad avere chiaramente il nostro problema Stesso discorso ce l'abbiamo qua Se abbiamo variabile main, vi faccio vedere, variabile main la metto qui e in qualche secondo mi toglie l'errore, perfetto.
Vado poi qua dentro, dentro l'if, mandiamo a schermo, vedete che anche qua non ho problemi, è 30, molto molto bene. Proviamo anche in questo blocco di codice, faccio play, ho 30, nessun problema. Prova ad andare fuori, vado dove magari nella funzione, variabile main e vedete che già ho un problema. Perché?
Perché non me la trova. Come faccio se voglio utilizzare una variabile all'interno di una funzione? Ho due alternative. O ho una variabile globale, perché la variabile globale la posso utilizzare praticamente ovunque.
Ecco qui, perfetto. Oppure se voglio usare la variabile main all'interno di una funzione devo passarla come argomento. Quindi variabile main è 0, ad esempio.
In questo caso variabile main ce l'ho, quindi che cosa fa riferimento? Fa riferimento a x perché è il primo. Di conseguenza se io mando a schermo qua così, salvo, ci aspettiamo 30, mando a schermo e ottengo 30. Vedete qua in basso?
Quindi ecco cosa servono i parametri delle funzioni. A far passare una variabile a cui non avremmo accesso, riusciamo a cedervi all'interno della funzione. Altrimenti dovremmo usare solo variabili globali, ma non possiamo usare solo variabili globali, sarebbe un disastro.
Quindi anche questa l'abbiamo vista. Proviamo adesso invece a lavorare. con le variabili all'interno di if o del blocco, ho la mia variabile blocco o variabile if, io vado qui non voglio più lavorare con x ma voglio lavorare ad esempio con variabile if, così, vediamo un po'mi dà problemi, vedete ho la mia variabile if qua, mi dà problemi voglio lavorare con variabile blocco metto qua, provo a fare play, mi dà errore, magari ho sbagliato un attimo il compilatore, mi dà continuamente problemi, quindi come posso agire in modo da utilizzarle all'interno devo essere dentro il blocco per sfruttare queste variabili però c'è un catch c'è un piccolo catch vedete 10 l'ho utilizzata ora voi mi direte giustamente perché questa è la grande domanda che mi aspetto vi sorga perfetto Edo tutto molto bello dentro le funzioni sì le utilizzo per le funzioni tanto poi o mando a schermo col console log direttamente oppure faccio return di conseguenza somma poi viene associato magari a variabile if e io ottengo fuori il valore Ok, lo sappiamo fare.
Magari questa variabile la passo come parametro, quindi ce l'ho dentro somma. Oppure mi hai fatto vedere come variabile main che è qua fuori, che fa parte però del main, è utilizzabile. all'interno di if, perché si trova, tra virgolette, nel blocco genitore. Ok, sto capendo.
Però io ho una domanda. Se avessi per caso un if in cui se succede qualcosa, creami una variabile, come faccio poi a utilizzarla fuori? Perché l'if mi serve per dire a questo main che sta succedendo qualcosa. Ma come faccio a dirgli, ok, usala poi fuori? Ed è qui la cosa da capire importante.
Che se andiamo a creare qua dentro la variabile nel blocco, di codice attenzione se la creiamo qua dentro resta locale se invece la andiamo a creare fuori vi faccio vedere la andiamo a creare fuori e magari mettiamo 10 oppure non mettiamo niente ma semplicemente poi la richiamiamo e gli diamo 10 allora così ha senso perché se io poi faccio play vedete che me la dà scusatemi non variabile main ma variabile if salvo Play, vedete che me la dà 10. Quindi qual è la grande differenza? Che se una variabile viene creata all'interno del blocco, come era prima, quindi se mettete int, la state creando, va bene? Se invece non mettete int davanti, ma la andate solo a riassegnare, ma la create fuori, giustamente potete chiamarla, perché?
Perché la variabile è variabile modificata nel if, ma è stata dichiarata fuori. Ma anche, non solo dichiarata, magari aveva già un valore, eh? Non siete obbligati a dichiararle e basta. Quindi per farvi capire come ad esempio in questo blocco qui abbiamo creato la nostra variabile blocco lì, se provo ad accedervi, vediamo un po', mi darà problemi chiaramente, nel momento in cui io la mia variabile blocco la vado a creare fuori, magari gli assegno un valore e poi semplicemente la rimodifico e gli do 0, vediamo un po', faccio play, chiaramente ottengo 0 e non 105 perché?
Variabile blocco l'ho creata fuori, gli ho dato 105, in questo blocco dovevo fare cose particolari, magari avevo una const int qwerty uguale a 5, ho fatto dei vari calcoli eccetera, mi è risultato poi 0 su variabile blocco, fate finta che qua ci sia un po'di codice in questo blocco particolare, quindi qwerty vive solo qua dentro. Invece variabile blocco vive qua fuori, di conseguenza posso accedere ad ogni blocco. Allo stesso modo potrei avere...
un sottoblocco e in questo sottoblocco vi faccio vedere, vale anche per gli if, per i for eccetera, faccio l'esempio solo con un blocco anonimo per farvi capire. Come vedete variabile blocco accedo perché chiaramente è qua, qwerty posso accedere perché è figlio, vedete che non mi dà problemi, nel momento in cui lo vado a spostare magari in un altro blocco mi dà problemi perché non lo trova. Questo è lo scope delle variabili, se ci pensate un attimino...
E se l'avete già capito è molto intuitiva come cosa, ha molto senso, ogni blocco di codice ha il suo scope, perciò la sua zona in cui le variabili hanno effetto, se lo scope è quello più grande, quindi blocco, sottoblocco, anzi sottoblocco, blocco più grande, blocco più grande ancora che è main, blocco più grande ancora che è tutto il file che è la nostra variabile globale. Va bene? Le funzioni non importa se sono dentro blocco, sottoblocco eccetera, ciò che è dentro la funzione è lì.
Perciò input e output come lo facciamo? Possiamo farlo sì con le variabili globali, cioè potremmo modificare qua la variabile globale, ad esempio, possiamo modificarla qui, la facciamo diventare 5, questa qua non ci interessa al momento, facciamo void, quindi potremmo modificare la nostra variabile globale qui e poi richiamarla qua con variabile globale e vi faccio vedere che nonostante tutto, chiamo un attimo somma, 0,0, tac. la mia variabile globale, vedete a 5 perché ho modificato qua il valore di variabile globale, voi potreste dire no è sbagliato era un'altra, mettiamo 1000 per sicurezza, faccio play e vedete che ottengo 1000, quindi con le funzioni possiamo lavorare in due modi, o lavoriamo solo con variabili globali, non va molto bene, oppure lavoriamo come vi ho spiegato con parametri in entrata, argomenti scusatemi in entrata e valori di ritorno in uscita.
Per tutti gli altri blocchi invece... funziona con ok c'è un blocco più grande lo utilizzo c'è un blocco più piccolino qua dentro vive solo la costante poi se esco la costante non c'è più ma c'è ancora variabile blocco perché fa riferimento qui e via discorrendo i blocchi possono essere infiniti uno dentro l'altro innestati l'abbiamo già visto con l'if, for eccetera tutto quello che vi ho insegnato lo rimettete assieme semplicemente applicate questo discorso delle variabili hanno un loro scopo in cui vivono tutto qua perciò direi che è tutto Ricordatevi che sul sito ho gli esercizi Sto per scrivere la documentazione Vedete se è già online Andrò a fare poi un corso avanzato E nada direi che possiamo proseguire Ci vediamo tra poco