2011-10-07 99 views
2
#include<stdio.h> 
#include<conio.h> 
#define square(v) v*v 
void main() 
{ 
int p=3; 
int s=square(++p); 
printf("%d %d",s,p); 
getch(); 
} 

輸出爲什麼16 4不是輸出? (Advance thanks)#定義奇怪

+0

見示例http://stackoverflow.com/questions/3605005/evaluate-macro-parameter-once-only解決方法。 – Cascabel

回答

12

一個宏基本上是一個文本的複製和粘貼。因此你的++被複制。

宏被擴展爲:

s = ++p * ++p; 

這就是宏的危險。 (在這種情況下,它也調用不確定的行爲)

+1

+1提到它調用UB –

+1

出於好奇,對此有何未定義? – MGZero

+2

在同一個變量上有兩個'++'語句。這是不明確的。 – Mysticial

3

++p * ++p 

的行爲是不確定的,它取決於編譯器

您可以使用inline將

inline int square(int p) { 
    return p * p; 
}