2013-06-12 8 views
14

Questa domanda è stato chiesto di me in una finta intervista ... Davvero siamo sorpresi di trovare le risposte scomode ...Confuso elevando al quadrato macro SQR in c

considerano una macro:

#define SQR(x) (x*x) 

Esempio 1:

SQR(2) //prints 4 

Esempio 2:

Se SQR (1 + 1) è dato non somma (1+1)-2 ma piuttosto ...

SQR(1+1) //prints 3 

Awkward giusto? Qual è il motivo? Come funziona questo codice?

NOTA: ho cercato SO ma non ho trovato nessuna domanda pertinente. Se ci sono gentilmente per favore condividilo!

+5

Hint : Leggi l'output del ** pre ** - processore. – SLaks

+12

'SQR (1 + 1)' espandi a '(1 + 1 * 1 + 1)' == 3, cambia in ((x) * (x)) – BLUEPIXY

+0

Questo è il preprocessore C. È possibile ottenere lo stesso comportamento se si è utilizzato il preprocessore C con qualsiasi lingua. – user7116

risposta

45

SQR(1+1) si espande a 1+1*1+1 che è 3, non 4, corretto?

una corretta definizione della macro sarebbe

#define SQR(x) ((x)*(x)) 

che si espande a (1+1)*(1+1) e, più importante, si mostra uno dei motivi non si dovrebbe usare le macro in cui non sono necessari. Il seguente è meglio:

inline int SQR(int x) 
{ 
    return x*x; 
} 

inoltre: SQR(i++) sarebbe comportamento indefinito se SQR è una macro, e tutto corretta se SQR è una funzione.

+3

Naturalmente, anche la macro "corretta" può ancora sorprenderti quando valuta l'argomento due volte. –

+0

@MikeSeymour questo quello che avevi in ​​mente? –

6

Il problema è che le macro stanno facendo testuale substition prima di essere compilato, in modo che il macro restituisce 1+1*1+1

6

Ecco perché si sempre put argomenti a macro in():

#define SQR(x) ((x)*(x))