不知道怎么编译有问题,就是箭头那儿,如果我把uchar i,j;放到while循环外面就能够通过编译,这是为什么,怎么这么奇怪,高手解释一下,我刚学单片机!
#include
#include
#include
#define uint unsigned int
#define uchar unsigned char
uchar temp,ftemp;
void delay(uint );
void main()
{
while(1)
{
temp=0xff;
uchar i,j;——————————————————————————>就是这儿
for(i=0;i<=7;i++)
{
temp=temp-pow(2,i);
P1=temp;
ftemp=temp;
for(j=0;j<=7-i;j++)
{
delay(500);
ftemp=_crol_(ftemp,1);
P1=ftemp;
}
P1=0xff;
delay(500);
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=144;y>0;y--);
}
引用: 引用 3 楼 zyzhang365 的回复:
变量需要在函数的开头定义。
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=144;y>0;y--);
}
那么我这个函数怎么没有问题,为什么变量要在函数开头定义,C中没有这样的规定!
你这个也是在函数的开始定义的啊, 也就是说在所有语句之前定义。 嵌入式C好像都是这样。
uchar temp,ftemp;
void delay(uint );
void main()
{
uchar i,j;// 放到这里。
while(1)
{
temp=0xff;
for(i=0;i <=7;i++)
{
temp=temp-pow(2,i);
P1=temp;
ftemp=temp;
for(j=0;j <=7-i;j++)
{
delay(500);
ftemp=_crol_(ftemp,1);
P1=ftemp;
}
P1=0xff;
delay(500);
}
}
}
C不像C++。变量在C里要定义在语句前,C++是随用随定义。使用在C中变量会出现没初始化的情况。
因为你把变量定义在循环语句里,相当于每循环一次就重复定义一次变量,当然会发生变量重复定义的错误。
不能编译是肯定的,之所以把变量定义在头部没问题是因为变量只执行了一次定义,没有被重复定义。
这个不是单片机的什么语言特殊问题,而是基本的语言使用问题,无论是C、C++、VB、VC、Delphi...等语言
如果你把定义变量的语句放到循环语句中,基本上都会出这样的问题,除非那个循环语句只循环一次,不然肯定
会出错。
其实只是编译器的设定问题,同样是c语言,比如用gcc编译器,变量定义是允许不放在函数开头的
另外c#和java都允许将变量定义放在循环体内而不会出现重复定义的错误
比如c#里:
这样是没有任何问题的,但i的作用域也会被限定在while这个循环体内,出了循环体i就被释放了,也就是在while循环体外不能再使用i这个变量。
所以说到底还是编译器的特性决定的
引用: 引用 4 楼 iwaich 的回复:
引用 3 楼 zyzhang365 的回复:
变量需要在函数的开头定义。
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=144;y>0;y--);
}
那么我这个函数怎么没有问题,为什么变量要在函数开头定义,C中没有这样的规定!
C99中没这么规定么?
正如打开头就抽假烟的人,抽一次真烟,会认为真烟是假的.
引用: 引用 13 楼 skylkj 的回复:
其实只是编译器的设定问题,同样是c语言,比如用gcc编译器,变量定义是允许不放在函数开头的
另外c#和java都允许将变量定义放在循环体内而不会出现重复定义的错误
比如c#里:
C# code
while(1)
{
int i;
i++;
}
这样是没有任何问题的,但i的作用域也会被限定在while这个循环体内,出了循环体i就被释放了,也就是在while循环体外不能再使用i这个变量。
所以说到底还是编译器的特性决定的
不是编译器决定的,而是语言决定的。
C变量定义要在函数开始的地方,C++则没有这个限制
同样的c代码,使用gcc编译器,变量申明是不需要放在函数开头的。
其实编译器也就是一个程序,最简单的例子,如果编译器是我做的,我在编译之前将代码当成文本处理,然后把所有出现在函数体中的变量声明都自动放到函数开头,然后再调用原本的编译程序,这样不就可以了吗?
所以最终决定这种特性的是编译器,而不是语言。
所谓的“C语言要求变量的定义必须放在可执行语句前面”,并不是因为语言本身有这种需求,而是当时的编译器就是这么设计的。