读书人

一段关于“左值”的延时小程序俺没看

发布时间: 2012-03-20 14:01:11 作者: rapoo

一段关于“左值”的延时小程序,俺没看懂,请高手指点!
这段程序,俺不知道为什么会有延时功能,按俺的想法,是没办法实现了。
程序如下://--------------------------------------------------
// Description : Hold program for 0 ~ 65535 ms
// Input Value : usNum --> Delay time
// Output Value : None
//--------------------------------------------------
void CTimerDelayXms(WORD usNum)
{
if(usNum)
{
bNotifyTimer0Int = _FALSE;

while(_TRUE)
{
if(bNotifyTimer0Int)
{
bNotifyTimer0Int = _FALSE;

if(--usNum) 这里是为什么啊???
TR0 = _ON;
else
return;
}
}
}
}

后来,俺在Keil C 中自己比照做个了雷同的,结果编译不过,说(--N不是左值)。请高手指点!
程序如下:
#include <reg51.h>

#define N 10
#define _FALSE 0
#define _TRUE 1
#define _ON 1

bit bNotifyTimer0Int;
void CTimerDelayXms()
{
if(N)
{
bNotifyTimer0Int = _FALSE;

while(_TRUE)
{
if(bNotifyTimer0Int)
{
bNotifyTimer0Int = _FALSE;

if(--N) // 这里是咋回事呢?????
TR0 = _ON;
else
return;
}
}
}
}


[解决办法]
N是宏定义,在预处理的时候就会被替换成10.编译器并没有为其分配存储空间。
一个有存储空间的变量才能进行--操作。
[解决办法]
#define N 10

改成

int N = 10;

宏相当与常量,常量不能作为左值,它是右值
[解决办法]
宏无法做自加减操作
只有变量可以!
[解决办法]
其他地方可能改变了bNotifyTimer0Int的值。bNotifyTimer0Int应该是voilate类型的变量或寄存器。

读书人网 >C语言

热点推荐