对于一个刚进入大学就接触C语言的我,感觉对C还是比较了解的,但是在做编译原理大作业语法分析器的时候使用了Yacc自动生成器,虽然是自动生成,但是需要写一个辅助函数,就在写这个辅助函数的时候出现了这个特别奇怪的bug
先上代码
int yylex(void){
static int done = 0;
static int c;
static int flag=0;
if(done)return 0;
if(flag==1){
flag=0;
if(c!=' '){
if(c=='\n')done=1;
return c;
}
}
while((c=getchar())==' ');
if(isdigit(c)){
yylval = c-'0';
while(isdigit(c=getchar())){
yylval *=10;
yylval +=c-'0';
}
flag=1;
return (NUM);
}
else if(c=='\n')
done=1;
return c;
}
bug 比较复杂,在这里就不赘述了,这里进入到咱们今天的重点,static int 和 int
静态变量就是要在程序的一开始就要载入,也就是它不是随着程序运行的时候而改变的
static int 和 int 在main函数中区别不大,但是如果涉及到子函数,那么区别就很大了。
static 可以看成是全局变量。
也就是说上面的代码中的状态变量都会随着函数的每一次调用而赋上初值
但是这个函数的初衷是要利用这些状态变量来进行一些跳转啊,循环啊之类的操作,所以这里需要设置成static