错题笔记:关于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

posted @ 2022-10-23 16:28  iZJ"Qq4577105  阅读(29)  评论(0编辑  收藏  举报