PDA

Visualizza la versione completa : [C++] Define funzione?


FinalFantasy
12-11-2005, 00:20
Su un testo delle olimpiadi di informatica ho trovato questo codice:

#include <iostream.h>
#include <stdlib.h>
#define prod(a,b) a*b

int main(){
int a=10,b=5;
cout<<a+b<<"-"<<a-b<<"\n";
cout<<prod(a+b,a-b)<<"\n";
system("PAUSE");
return 0;
}

lo provato è il risultato viene 55 (come riporta anche la correzione del test), ma xke? a+b = 15; a-b=5 ... 15*5=75
:master: :master: :master:
cosa mi sfugge?

ZIko
12-11-2005, 00:26
Questop succede perché facendo cout<<a+b lui stampa 10+5=15 (non modifica le variabili) e poi facendo cout<<10-5=5 (anche questo non modifica le variabili.

In sostanza se faccio:
a=a+b; mofico la variabile, se invece faccio:
cout<<a+b; stampa la somma ma le variabili rimangono come prima

Spero di aver capito il tuo problema e di essermi spiegato bene! :D

ZIko
12-11-2005, 00:30
No, non avevo capito il problema, adesso si :madai!?: e effettivamente non riesco a capirlo neanche io.

oregon
12-11-2005, 00:45
Originariamente inviato da FinalFantasy
Su un testo delle olimpiadi di informatica ho trovato questo codice:

#include <iostream.h>
#include <stdlib.h>
#define prod(a,b) a*b

int main(){
int a=10,b=5;
cout<<a+b<<"-"<<a-b<<"\n";
cout<<prod(a+b,a-b)<<"\n";
system("PAUSE");
return 0;
}

lo provato è il risultato viene 55 (come riporta anche la correzione del test), ma xke? a+b = 15; a-b=5 ... 15*5=75
:master: :master: :master:
cosa mi sfugge?

Il preprocessore (la parte del compilatore che si occupa delle direttive che iniziano con #), nel caso della define, lavora effettuando una semplice sostituzione del testo.
Nel tuo caso, il sorgente viene modificando dal preprocessore in questo modo ... Al posto della linea

cout<<prod(a+b,a-b)<<"\n";

genera la nuova linea

cout<<a+b*a-b<<"\n";

perche', data la macro prod, sostituisce al primo parametro (a) la stringa a+b e al secondo parametro (b) la stringa a-b inserendo l'operatore * tra le due stringhe. Ovvero esegue la sostituzione seguente

a * b
a+b * a-b

Ma a questo punto, nell'espressione

a+ b*a -b

il prodotto ha la priorita' e quindi verrà eseguita l'operazione equivalente

10+ (5*10) -5

cioe'

10+ 50 -5

ovvero 55.

Per evitare questo tipo di problemi (classici delle definizioni errate delle macro) basta porre i parametri sostituiti in parentesi, cioe' scrivere nel programma

#define prod(a,b) (a)*(b)

in modo che dopo la sostituzione diventi

(a) * (b)
(a+b) * (a-b)

e quindi il risultato corretto.

Spero di essermi spiegato.

Loading