错题笔记:关于C语言变量声明在其他语句后的一些细节
代码1(写51时发现的局部变量问题)
错误示范:
查看代码
//对count,sec计数
void timer0()interrupt 1
{
static unsigned char count=0;
//unsigned char K=0; //放这里没问题,定义成全局变量也没问题
TH0=0XEE;
TL0=0X00;
TR0=1;
count++;
unsigned char K=0; //放这里keil直接报错说未定义 很奇葩
if(sec<50)
K=10;
else K=200;
if(count==K){
sec++;
count=0;
}
if(sec==100)sec=0;
decade=SMG[sec/10];
unit=SMG[sec%10];
}
正确示范:
查看代码
//对count,sec计数
void timer0()interrupt 1
{
static unsigned char count=0; //局部变量声明在函数体的开头
unsigned char K=0; //局部变量声明在函数体的开头
TH0=0XEE;
TL0=0X00;
TR0=1;
count++;
if(sec<50)
K=10;
else K=200;
if(count==K){
sec++;
count=0;
}
if(sec==100)sec=0;
decade=SMG[sec/10];
unit=SMG[sec%10];
}
效果:
代码2
void delay(uint xms)
{
for(;xms>0;xms--)
{
unsigned char i,j;
i = 12;
j= 169;
do{
while (--j);
}while(--i);
}
}
unsigned char i,j; 虽然这行我们没有放在函数开头,但是这样编译没报错。但我建议还是放在函数开头最保险,也是养成一个良好的编程习惯。
改写:
查看代码
void delay(uint xms)
{
unsigned char i,j;
for(;xms>0;xms--)
{
i = 12;
j= 169;
do{
while (--j);
}while(--i);
}
}
代码3
void delay(uint xms)
{
unsigned char i,j;
for(;xms>0;xms--)
{
i = 12;
j= 169;
uchar a;
do{
while (--j);
}while(--i);
}
}
keil编译效果:
他就直接提示变量a有问题,未定义。
改写:
void delay(uint xms)
{
uchar a;
uchar i,j;
for(;xms>0;xms--)
{
i = 12;
j= 169;
do{
while (--j);
}while(--i);
}
}
总结:由于编译器版本不同,有些细节编译规则也不同,所以建议养成规范的编程风格。这是一个早期的C语言规定,在VC6(即C90标准)下以及很多早期的编译器版本,每个块级作用域中的所有变量的声明必须放在最前面,一旦执行任何其他非声明语句之后,后续的任何声明都将错误。C99之后,此标准被改变,允许在任何需要变量的时候进行声明。
本文转载:https://www.cnblogs.com/ryzz/p/9283751.html
作者QQ4577105