2011-10-07 88 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; 
}