Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [C++] Define funzione?

  1. #1
    Utente bannato
    Registrato dal
    Jun 2003
    Messaggi
    3,657

    [C++] define funzione?

    Su un testo delle olimpiadi di informatica ho trovato questo codice:
    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?

  2. #2
    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!
    Ci provo...e ci riesco!!!
    http://kings.altervista.org

  3. #3
    No, non avevo capito il problema, adesso si e effettivamente non riesco a capirlo neanche io.
    Ci provo...e ci riesco!!!
    http://kings.altervista.org

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462

    Re: [C++] define funzione?

    Originariamente inviato da FinalFantasy
    Su un testo delle olimpiadi di informatica ho trovato questo codice:
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.