2013-06-12 7 views
14

Diese Frage in einem Mock Interview mir gefragt wurde ... Wirklich bekam überrascht peinliche Antworten zu finden ...Verwirrt von Makro SQR in c quadriert

betrachten ein Makro:

#define SQR(x) (x*x) 

Beispiel 1:

SQR(2) //prints 4 

Beispiel 2:

Wenn SQR (1 + 1) gegeben ist es nicht (1+1)-2 sondern ...

SQR(1+1) //prints 3 

Ungeschickte Recht hat Summe? Was ist der Grund? Wie funktioniert dieser Code?

HINWEIS: Ich suchte SO, konnte aber keine relevanten Fragen finden. Wenn es welche gibt, bitte teile es mit!

+5

Hint : Lesen Sie die Ausgabe des ** pre ** - Prozessors. – SLaks

+12

'SQR (1 + 1)' expandiere nach '(1 + 1 * 1 + 1)' == 3, ändere zu ((x) * (x)) – BLUEPIXY

+0

Dies ist der C-Präprozessor. Sie können dasselbe Verhalten erreichen, wenn Sie den C-Präprozessor mit einer beliebigen Sprache verwenden. – user7116

Antwort

45

SQR(1+1) expandiert auf 1+1*1+1 was ist 3, nicht 4, richtig?

wäre eine korrekte Definition des Makros

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

, die (1+1)*(1+1) erweitert und wichtiger, zeigen Sie eine der Gründe, warum Sie nicht Makros, wo sie benötigt werden, nicht verwendet werden sollen. Im Folgenden ist besser:

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

Außerdem: SQR(i++)undefinierten Verhalten wenn SQR ist ein Makro sein würde, und ganz richtig, wenn SQR eine Funktion ist.

+3

Natürlich kann selbst das "korrigierte" Makro Sie immer noch überraschen, wenn es das Argument zweimal auswertet. –

+0

@MikeSeymour das, was Sie im Sinn hatten? –

6

Das Problem ist, dass Makros Textsubstitutions tun, bevor es kompiliert wird, so das Makro expandiert nach 1+1*1+1

6

Deshalb ist man immer vorgetragenen Argumente zu Makros in():

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