Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-01-2010, 16:26   #1
Gremo
Senior Member
 
L'Avatar di Gremo
 
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
[Linguaggi] Prima l-valore o r-valore?

Ciao a tutti. Sul mio libro c'è un semplice esempio degli effetti collaterali che si possono verificare in merito al calcolo di l-valore e r-valore.
L'esempio è il seguente (a è un vettore):

Codice:
b = 0;
a[f(3)] = a[f(3)] + 1;

int f (int n)
{
   if (b == 0)
   {
      b = 1;
      return 1;
   }
   else
      return 2;
}
Quello che si ottiene è assegnare il valore di a[1] + 1 ad a[2] (secondo il libro). Ma negli assegnamenti lo l-valore non deve essere calcolato prima?

Grazie dell'aiuto
__________________

Desktop: Intel i7-4770K | Asus Gryphon Z87 | Crucial 16GB DDR3 1600MHz | Gigabyte GTX 780 OC Windforce x3 | Samsung 840 Pro 128GB (x 2 RAID0) | be quiet! Straight Power E9 680W CM
Mercatino: bottoni, Dede371, pippokennedy, Bulbi_67, randose, DarkSiDE, davidepaco, _Legend_
Gremo è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2010, 16:37   #2
Z80Fan
Senior Member
 
L'Avatar di Z80Fan
 
Iscritto dal: Sep 2009
Messaggi: 638
Quote:
Originariamente inviato da Gremo Guarda i messaggi
Ciao a tutti. Sul mio libro c'è un semplice esempio degli effetti collaterali che si possono verificare in merito al calcolo di l-valore e r-valore.
L'esempio è il seguente (a è un vettore):

Codice:
b = 0;
a[f(3)] = a[f(3)] + 1;

int f (int n)
{
   if (b == 0)
   {
      b = 1;
      return 1;
   }
   else
      return 2;
}
Quello che si ottiene è assegnare il valore di a[1] + 1 ad a[2] (secondo il libro). Ma negli assegnamenti lo l-valore non deve essere calcolato prima?

Grazie dell'aiuto
No, il compilatore genera il codice per prima calcolare il r-value, poichè è quello che gli serve per portare avanti l'espressione: se analizzi un codice più semplice:
a=b+3;
prima viene eseguito b+3, poi viene eseguito a=x dove x è il risultato di b+3.
per questo viene eseguito il f(3) del a[f(3)] + 1, perchè i passi che esegue per portare avanti l'espressione sono:
- Trova l'indice del vettore ( chiama f(3) nel r-value)
- preleva l'elemento a quella posizione nel vettore (p. es: 5 )
- esegui 5+1
- trova l'indice del vettore nella l-value
- memorizza il risultato precedente nella posizione del vettore calcolata.

Generalmente tieni presente che un'espressione viene valutata da destra verso sinistra, ma anche questa non è una regola fissa, sopratutto in espressioni più complesse, metti:
a[ f(1) ] = ( a[ f(2) ] +4 ) * a[ f(3) ] ;
Viene prima eseguita la chiamata f(2), poi la f(3) e quindi la f(1).

Spero di essere stato chiaro
__________________
| Il mio "OS" (thread su HWU) | |
Z80Fan è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2010, 17:17   #3
Gremo
Senior Member
 
L'Avatar di Gremo
 
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
Quote:
Originariamente inviato da Z80Fan Guarda i messaggi
No, il compilatore genera il codice per prima calcolare il r-value, poichè è quello che gli serve per portare avanti l'espressione: se analizzi un codice più semplice:
a=b+3;
prima viene eseguito b+3, poi viene eseguito a=x dove x è il risultato di b+3.
per questo viene eseguito il f(3) del a[f(3)] + 1, perchè i passi che esegue per portare avanti l'espressione sono:
- Trova l'indice del vettore ( chiama f(3) nel r-value)
- preleva l'elemento a quella posizione nel vettore (p. es: 5 )
- esegui 5+1
- trova l'indice del vettore nella l-value
- memorizza il risultato precedente nella posizione del vettore calcolata.

Generalmente tieni presente che un'espressione viene valutata da destra verso sinistra, ma anche questa non è una regola fissa, sopratutto in espressioni più complesse, metti:
a[ f(1) ] = ( a[ f(2) ] +4 ) * a[ f(3) ] ;
Viene prima eseguita la chiamata f(2), poi la f(3) e quindi la f(1).

Spero di essere stato chiaro
Ciao, innanzitutto grazie mille Il discorso è abbastanza chiaro, anche se non campisco perchè il compilatore in x = b + 3 debba prima valutare l'r-valore: il risultato, qualsiasi esso sia, deve essere memorizzato in x, quindi occorre in ogni caso valutare anche la locazione, e questa valutazione può essere fatta anche prima...o sbaglio?
Inolte nel tuo ultimo esempio non mi è chiarissimo perché viene prima f(2), poi f(3) e poi f(1): gli esercizi che devo svolgere sono proprio di questo tipo, vorrei cercare di capirli bene...
Ti ringrazio per l'aiuto
__________________

Desktop: Intel i7-4770K | Asus Gryphon Z87 | Crucial 16GB DDR3 1600MHz | Gigabyte GTX 780 OC Windforce x3 | Samsung 840 Pro 128GB (x 2 RAID0) | be quiet! Straight Power E9 680W CM
Mercatino: bottoni, Dede371, pippokennedy, Bulbi_67, randose, DarkSiDE, davidepaco, _Legend_
Gremo è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2010, 18:47   #4
Z80Fan
Senior Member
 
L'Avatar di Z80Fan
 
Iscritto dal: Sep 2009
Messaggi: 638
Quote:
Originariamente inviato da Gremo Guarda i messaggi
Ciao, innanzitutto grazie mille Il discorso è abbastanza chiaro, anche se non campisco perchè il compilatore in x = b + 3 debba prima valutare l'r-valore: il risultato, qualsiasi esso sia, deve essere memorizzato in x, quindi occorre in ogni caso valutare anche la locazione, e questa valutazione può essere fatta anche prima...o sbaglio?
Inolte nel tuo ultimo esempio non mi è chiarissimo perché viene prima f(2), poi f(3) e poi f(1): gli esercizi che devo svolgere sono proprio di questo tipo, vorrei cercare di capirli bene...
Ti ringrazio per l'aiuto
Proviamola a mettere in questo modo: come sai gli operatori matematici ( + - * / ) hanno una precedenza ben definita, così pure tutti gli operatori del C(++), ad esempio un po' di operatori messi in ordine decrescente di precedenza (in alto quello con più precedenza, presi dal mio libro di c++):
( ) Parentesi
[ ] Indicizzazione di un array
. selezione di un membro tramite oggetto
++ postincremento
& indirizzo
* moltiplicazione
/ divisione
+ somma
- sottrazione
(altri)
= assegnazione
+= assegnazione con somma

come vedi le assegnazioni (ce ne sono altre) sono gli operatori con la minor precedenza (tralasciando l'operatore virgola), quindi la loro esecuzione viene eseguita per ultima, in questo esempio:
k = c * (a+b) - 4
la priorità maggiore ce la ha (a+b), perchè è racchiusa tra parentesi, poi viene *c, perchè ha la precedenza sul -4, poi viene la sottrazione - 4 ed infine l'assegnazione su k, poichè l'assegnazione ha la precedenza inferiore.
A noi può sembrare un po' strano, perchè siamo tenuti a leggere da sinistra a destra, ma il compilatore lavora solo sulle precedenze e le regole di precedenza gli dicono di gestire l'assegnazione per ultima.
Tornando all'esempio precedente:
a[ f(1) ] = ( a[ f(2) ] +4 ) * a[ f(3) ] ;
Il compilatore valuta (a[ f(2) ] +4) per prima per via delle parentesi, ma per farlo deve valutare a[ .. ] poichè l'indicizzazione ha precedenza superiore alla somma, e per trovare l'indice deve eseguire f(2). Solo dopo che ha risolto questo calcolo ed esaurito la precedenza può analizzare a[ f(3) ], di nuovo, prima gli operatori [ ] (quindi esegue f(3) ), poi la moltiplicazione con il semitotale che aveva calcolato prima, quindi ha il risultato finito e può eseguire l'assegnazione, esegue l'ultimo [ ] e quindi effettua definitivamente l'assegnazione.
Meglio così?
__________________
| Il mio "OS" (thread su HWU) | |
Z80Fan è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Avio si prepara ai test del Dimostratore...
Space Pioneer ha annunciato le cause del...
Anthropic avrebbe nuovi antibiotici cont...
Scoperto un 'moltiplicatore nascosto' ne...
DREO: a IFA 2026 4 novità fra cui...
Slackbot genera dashboard e microsite de...
Idrogeno, nuova cella a combustibile rag...
Con la NASA fuori dai giochi, l'ESA risc...
Una falla di ChatGPT permette di estrapo...
Piano clima, 1,34 miliardi per il bonus ...
Porsche esce definitvamente da Bugatti R...
NVIDIA App aggiunge una delle funzioni p...
Come sarebbe il mondo se la luce viaggia...
Titanio, ceramica e zaffiro per HUAWEI W...
Taglio delle accise sul gasolio prorogat...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 05:19.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v