|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
[Linguaggi] Dubbi su pre e post incremento (decremento),lvalue ed rvalue
Ciao a tutti. Devo sostenere Linguaggi 1, sul mio libro non riesco a trovare esempi e neppure su internet. Ho solo esercizi del prof. con i risultati, senza spiegazione. Spero mi possiate aiutare o indirizzare verso qualche buon testo. Si parla in generale di linguaggi C-like.
Qualcosa di semplice: Codice:
x = 3; z = 2; x += z++; dovrebbe essere equivalente a scrivere: x = x + z; z = z + 1; Codice:
foo(a[i++]); equivale a: foo(a[i]); i = i + 1; Ultimo caso. Se ho una chiamata a funzione: Codice:
v = 3; G(v-- + R(v)) chiedo veramente un aiuto, un tutorial, altrimenti potrei impazzire (già studiare il 5 agosto... ). E pensare che credevo di conoscere il linguaggi Ciao |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Sep 2008
Città: Milano
Messaggi: 126
|
Codice:
x = 3; z = 2; x += z++; dovrebbe essere equivalente a scrivere: x = x + z; z = z + 1; Codice:
foo(a[i++]); equivale a: foo(a[i]); i = i + 1; Codice:
v = 3; G(v-- + R(v)) EDIT: guarda se questo ti può interessare: http://www.embedded.com/story/OEG20020429S0037 ciao! british Ultima modifica di british : 05-08-2009 alle 21:30. Motivo: aggiunto link |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 1059
|
cioè quando ritorna foo(), allora i viene incrementato. Quindi se accedo a i, ad esempio nel corpo di foo(), il valore è da considerarsi senza incremento?
prima di tutto nella funzione foo() non hai accesso alla i, ma solo al valore i-esimo dell'array che viene passato come argomento e poi: se i = 10 foo(a[i++); equivale a foo(a[10]); la i viene incrementata solo dopo aver effettuato la chiamata alla funzione. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
Non è indefinito, è sugli esercizi del professore. Cmq leggendo velocemente l'articolo che mi hai linkato, mi è venuto in mente che è specificato, nell'esercizio, ordine di valutazione degli argomenti da sinistra a destra. Quindi quale sarebbe l'invocazione corretta?
|
|
|
|
|
|
#5 | |
|
Senior Member
Iscritto dal: Oct 2000
Città: Udine
Messaggi: 3178
|
Quote:
Codice:
{
i= 1;
void foo(by value int x) {
x = 4; // non serve a nulla
stampa(i);
}
foo(i++);
}
quindi i viene incrementata subito dopo la chiamata (quando ENTRO in foo()), o quando la chiamata ritorna? Ultima modifica di Gremo : 05-08-2009 alle 21:48. |
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
Lo mandi in esecuzione e ti togli il dubbio Comunque, se non erro, la definizione degli operatori di pre e post incremento è ben definita: ++(expression) L'operatore di pre-incremento aggiunge 1 a expression e restituisce il risultato. expression++ L'operatore di post-incremento aggiunge 1 a expression e restituisce il valore iniziale di expression (il valore prima dell'addizione). Percui nel tuo esempio che ho quotato la variabile 'i', inizializzata al valore 1, quando viene passata per copia del valore alla invocazione della funzione 'foo', la copia passata vale ancora 1 (in quanto è il valore di ritorno dell'operatore di post-incremento e di conseguenza il parametro formale 'x' dentro lo scope di 'foo' vale 1) mentre la variabile 'i' vale 2.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 06-08-2009 alle 09:49. |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 314
|
Io per G(3 + R(3)) . MINGW32
Edit: Nel C l'ordine di valutazione degli operandi di un qualsiasi operatore non e' conosciuto a priori (ad eccezione degli operatori '&&', '||' '?:' e ','). Questo significa che data l'espressione a = f1() + f2(), non e' possibile sapere a priori se verra' valutata prima la funzione f1() e poi la funzione f2() o viceversa. Pertanto se la funzione f1() altera il valore di una variabile utilizzata dall'altra funzione f2() o viceversa, il risultato dipendera' dall'ordine di valutazione delle due funzioni. Non e' conosciuto a priori nemmeno l'ordine di valutazione degli argomenti passati ad una funzione, pertanto una chiamata a funzione del tipo: 'funz(a, ++a)' produce un risultato dipendente dall'implementazione del compilatore usato. Situazione analoga si puo' avere in una chiamata a funzione del tipo: 'funz (funz2(a) - funz2(b))' se il valore ritornato da funz2() puo' risultare diverso tra la prima e la seconda chiamata http://www.wowarea.com/italiano/linux/linguaggioc06.htm
__________________
Athlon64 x2 5600 - AsRock ALiveNF5eSata2+ - kingston 2GB ddr2 800 - GeForce 8800gts 320MB Ultima modifica di Rsk : 06-08-2009 alle 11:46. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Su Code::Blocks (quindi compilatore mingw):
Codice:
G(3+R(3))
__________________
Il sole è giallo |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 384
|
Io ho provato a fare il programma:
Codice:
#include <iostream>
using namespace std;
void G(int arg)
{
cout << "G: v-- + R(v): " << arg <<"\n";
}
int R(int arg)
{
cout << "R: v= " << arg<<"\n";
return arg;
}
int main()
{
int v=3;
G(v-- + R(v));
cout << "v: " << v;
cout << "\n";
return 0;
}
:Codice:
R: v= 3 G: v-- + R(v): 6 v: 2 Ultima modifica di xblitz : 06-08-2009 alle 11:36. |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 384
|
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Minchia, è partita l'investigazione di massa
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Java 6 concorda.
Attendiamo cdimauro per il pitone
__________________
Il sole è giallo |
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
Quote:
Codice:
public class Program
{
static void Main(string[] args)
{
int v = 3;
G(v--, R(v));
Console.Read();
}
static int R(int j)
{
Console.WriteLine("R: a = {0}", j);
return j;
}
static int G(int a, int b)
{
Console.WriteLine("G: a = {0} b = {1}, a+b = {2}", a, b, a + b);
return a + b;
}
}
}
Codice:
R: a = 2 G: a = 3 b = 2, a+b = 5 |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Feb 2007
Città: Verona
Messaggi: 1060
|
Ovvero, comportamento indefinito per C/C++ (dipende dal compilatore...)?
__________________
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Mar 2007
Messaggi: 384
|
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Quote:
EDIT: ho visto ora il post di xblitz, per ora in entrambi i casi (mingw e cl microsoft) viene valutata come g(3+r(3))
__________________
Il sole è giallo Ultima modifica di yorkeiser : 06-08-2009 alle 11:58. |
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
si si io infatti facevo la mia parte col c#, non dovevo? ![]() EDIT: a me cmq sembra che tutti quelli che hanno fatto prove col c++ hanno avuto lo stesso risultato, ossia diverso da tutti gli altri linguaggi Ultima modifica di astorcas : 06-08-2009 alle 11:57. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 08:44.










). E pensare che credevo di conoscere il linguaggi 

:







