MACRO ERRATA - ma perché? -

di il
4 risposte

MACRO ERRATA - ma perché? -

Ciao a tutti,
vi sottopongo una "banale" macro definita in un file header. Di seguto riporto la sua definizione:

	#define square(x) x * x

In un primo caso sembra poter essere adeguata, ad esempio:

	int z = 5;
	printf("square(%d) = %d\n", square(z));
In questo caso varò square(5) = 25;
Ma se eseguo il seguente codice la macro risulta palesemente errata:

	int z = 5;
	printf("Risultato di square(z+1) %d\n", sqaure(z+1));
Infatti in questo caso il risultato è 11. Mi aiutate a capire come avviene al sostituzione?

Se correggo la macro in

	#define square(x) (x) * (x)
Allora funziona in tutti i casi.

Nel caso errato sia sembrerebbe fare (z+1) + z = 11... Ma come è possibile?


Grazie mille

4 Risposte

  • Re: MACRO ERRATA - ma perché? -

    Devi fare attenzione alle parentesi e agli spazi

    #define square(x) ((x)*(x))
  • Re: MACRO ERRATA - ma perché? -

    oregon ha scritto:


    Devi fare attenzione alle parentesi e agli spazi

    #define square(x) (x*x)
    Buongiorno Oregon,
    sempre preziosissimo e disponibile. Ma sai darmi una spiegazione di tale comportamente? Qual è la modalità di "sostituzione" in fase di preprocessamento?

    Grazie moltissime.
  • Re: MACRO ERRATA - ma perché? -

    Guarda che ho modificato ... ci sono altre parentesi.

    Dovresti spiegartelo da solo ... prova a scrivere la printf sostituendo al valore quello che hai impostato e fai tu il calcolo a mano
  • Re: MACRO ERRATA - ma perché? -

    oregon ha scritto:


    Guarda che ho modificato ... ci sono altre parentesi.

    Dovresti spiegartelo da solo ... prova a scrivere la printf sostituendo al valore quello che hai impostato e fai tu il calcolo a mano
    Suepr Oregon,
    in effetti sono son caduto calmo e placido nelle trappole delle meraviglie delle macro! Ahahah

    x+1*x+1 = x +(x+1)+1 = 11 !!!!! ARGHHHHH

    Grazie mille, sarà stata l'ora??? No, che devo togliermi molta rugginie!!! ahah

    E' sempre un piacere, un saluto!
Devi accedere o registrarti per scrivere nel forum
4 risposte