Valore (Informatica)

Article

August 17, 2022

In informatica, un valore è un'espressione che non può essere ulteriormente valutata. Ad esempio, l'espressione "1 + 2" non è un valore perché può essere ridotta all'espressione "3". L'espressione "3" non può essere ulteriormente ridotta, quindi è un valore. Le espressioni hanno sia attributi di tipo che attributi di categorie di valori. Le due proprietà sono indipendenti l'una dall'altra. Cioè, per ogni tipo di espressione, esistono varie classificazioni di valore. La maggior parte dei linguaggi di programmazione supporta diversi valori comuni.

Assegnazione: lvalue e rvalue

Alcune lingue utilizzano i concetti di l-value e r-value. Un lvalue ha un indirizzo di memoria definito che può essere ottenuto. Ciò significa che un lvalue può essere una variabile o il risultato di una dereferenziazione di un puntatore a un indirizzo di memoria specifico. Ad esempio, l'espressione (4 + 9) in linguaggio C, quando viene eseguita, il computer produce un valore intero 13, ma poiché il programma non specifica esplicitamente come questo 13 viene memorizzato nel computer, questa espressione produce un valore. D'altra parte, se un programma C dichiara una variabile x e assegna a x il valore 13, allora expression(x) restituisce 13 ed è un lvalue. In C, il termine "lvalue" originariamente indicava un oggetto a cui poteva essere assegnato un valore (cioè, sul lato sinistro di un operatore di assegnazione), ma poiché "const" è stato aggiunto al linguaggio, tali oggetti sono ora chiamati "modificabili a sinistra valore". In C++, lvalues ​​e rvalues ​​sono categorie di espressioni e un'espressione deve essere un lvalue o un rvalue. C++11 espande la lvalueness di cui sopra in una categoria di valori più complessa, che include tre classificazioni fondamentali: lvalue, prvalue e xvalue ), un'espressione deve essere una delle tre. I concetti di lvalue e rvalue sono stati introdotti per la prima volta in un documento sul linguaggio di programmazione CPL. Il lvalue definito in questo momento è un oggetto che può essere posizionato sul lato sinistro del numero di assegnazione per assegnare un nuovo valore; il rvalue è un oggetto che può essere posizionato sul lato destro del numero di assegnazione per leggerne il valore. Nella lingua B, lvalues ​​e rvalues ​​sono specificati come elementi della grammatica. In C, la grammatica non distingue più tra lvalues ​​e rvalues, il concetto di lvalues ​​è conservato nelle regole semantiche e "rvalue" è trattato come sinonimo di "value" in ISO C. Il linguaggio C++ introduce oggetti qualificati const. gli oggetti const possono prendere indirizzi, ma non possono essere assegnati; e alcuni oggetti rvalue possono anche apparire sul lato sinistro del numero di assegnazione ed essere assegnati. Pertanto, a partire dallo standard C++03, le espressioni con un'identità sono specificate come lvalues ​​e le espressioni senza un'identità sono specificate come rvalues. Pertanto, nomi, puntatori, riferimenti, ecc. sono valori, che sono oggetti denominati con un indirizzo di memoria definito; letterali, oggetti temporanei, ecc. sono valori, a cui è possibile accedere solo all'interno dell'espressione che li ha creati. I nomi delle funzioni sono lvalue (che non sono né lvalue né rvalues ​​in C), i nomi degli array sono lvalue costanti, ma i nomi delle funzioni e degli array vengono automaticamente e implicitamente convertiti in rvalues ​​nella maggior parte delle espressioni. Rvalues ​​sono di breve durata, quindi gli lvalue sono necessari per acquisire rvalues. La copia di un rvalue in un lvalue è un'operazione comune. Lo standard C++11 ha introdotto i tipi di dati di riferimento rvalue e sposta la semantica, quindi le definizioni di lvalue e rvalue sono cambiate molto. Una variabile di riferimento rvalue è associata a un rvalue, estendendo la durata dell'oggetto temporaneo corrispondente a rvalue. Sposta semantica sposta il contenuto di un oggetto temporaneo in un oggetto lvalue. Pertanto, in C++11, per la classificazione dei valori, dovrebbero essere considerati identità e mobilità.La combinazione dei due produce cinque classificazioni: tipo di valore di base lvalue: un'espressione che può essere utilizzata per ottenere un indirizzo utilizzando l'operatore di indirizzo &. Può anche essere definito come un oggetto non temporaneo o una funzione non membro. Ha l'identificazione, ma non è rimovibile. Questo è anche il classico lvalue di C++03. Può essere utilizzato per inizializzare i riferimenti lvalue. Possono esserci tipi incompleti. includere: Nomi di variabili e funzioni nell'ambito, indipendentemente dal tipo. Pertanto, un riferimento denominato rvalue, ovvero una variabile con un tipo di riferimento rvalue, è anche un'espressione lvalue, che è una regola generale, non un caso speciale. Un'espressione di chiamata di funzione o un'espressione di operatore sovraccaricata se il tipo restituito è un riferimento lvalue o un riferimento rvalue a un tipo di funzione. Pre-incremento integrato (prefisso ++), pre-decremento (prefisso --), dereferenziazione (dereferenziazione)