我预计以下程序的输出为10 20但是10 10。
#include <stdio.h>
#define i 10
int main()
{
printf("%d\t",i);
fun();
printf("%d",i);
return 0;
}
fun(){
#undef i
#define i 20
}
如果我假设函数调用fun()
返回到main()
然后打印原始的i
值,那么通过查看以下程序的输出,我又错了/ p>
#include <stdio.h>
#define i 10
fun(){
#undef i
#define i 20
}
int main()
{
printf("%d\t",i);
fun();
printf("%d",i);
return 0;
}
预期输出:10 20但输出为:20 20
有人能解释一下这种行为吗?
答案 0 :(得分:1)
#define
是预处理器MACRO。该值在编译时而不是运行时替换。
因此,处理按照#define
的存在(序列)进行。这意味着,您不能指望#undef
和#define
在运行时工作。
详细说明,您的案例1代码看起来像
#include <stdio.h>
#define i 10
int main()
{
printf("%d\t",10);
fun();
printf("%d",10);
return 0;
}
fun(){
#undef i
#define i 20
}//now i is 20, but no one is using it, at compile time
并且,您的第二个代码看起来像
#include <stdio.h>
#define i 10
fun(){
#undef i
#define i 20 // i get a new definition here
}
int main()
{
printf("%d\t",20);
fun();
printf("%d",20);
return 0;
}
注意:main()
的推荐签名为int main(void)
。
答案 1 :(得分:1)
编译时的第一步是将所有PREPROCESSING TOKENS替换为其值。所以评估是在编译时完成的,而不是在运行时完成的。
所以你得到的第一个例子就是:
#include <stdio.h>
int main()
{
printf("%d\t",10); // we have only seen define i 10 until now
fun();
printf("%d",10); // we have only seen define i 10 until now
return 0;
}
fun(){
// the two in here would have made any i after this location be replaced with 20
}
类似于你的第二个案例。