如下代码:
CODE:
uchar keyGet(){
uchar k;
P1|=0x07;
k=P1;
k>>=1; //此处指令,Keil判断变量k没有实际意义,没有编译,看汇编代码就知道了.
if(!CY) return 0;//右移时,最低位移入了CY,由于上面行没被编译,这行就失去了意义!
k>>=1;
if(!CY) return 1;
k>>=1;
if(!CY) return 2;
return 0xFF;
}由于没有编译k>>=1;,造成其下一行:if(!CY)产生错误结果.朋友们要小心啊!!!!!!!!!!!!!
[ 本帖最后由 ybzjllj 于 2008-7-16 12:49 编辑 ]


最新回复
ybzjllj (2008-7-16 12:44:31)
CODE:
看汇编代码如下:uchar k; //在函数外声明
uchar keyGet(){
P1|=0x07;
k=P1;
k>>=1; //此处就要编译了
if(!CY) return 0;
k>>=1;
if(!CY) return 1;
k>>=1;
if(!CY) return 2;
return 0xFF;
}
右移指令编译了.JPG
tssing (2008-7-16 12:45:13)
ybzjllj (2008-7-16 12:47:13)
各位,遇类似情况要小心!!!!!!!!!!!!!!!!!!!
fz5098 (2008-7-16 13:01:49)
fz5098 (2008-7-16 13:02:37)
ybzjllj (2008-7-16 16:45:26)
znz23456 (2008-7-16 17:05:00)
hgjinwei (2008-7-16 18:30:44)
chasdfgh (2008-7-16 19:01:33)
leotron (2008-7-16 21:30:35)
ybzjllj (2008-7-17 10:29:01)
来回复的多数都是为了硬币啊?
yang007 (2008-7-17 14:21:56)
projectbox (2008-7-17 14:53:02)
hotrainbow (2008-7-17 16:36:14)
guidanghu520 (2008-7-17 17:25:12)
shiwen1982 (2008-7-17 23:06:02)
xieyi (2008-7-18 08:46:03)
QUOTE:
没有真正明白楼主程序的意图,这个问题我的理解是:我觉得最主要的原因是这样的移位好像是不会影响 CY ,所以编译器在编译的时候把此句忽略了(节省代码空间,可以试一下k<<=1;就可以编译了),我们在编程的时候应该要注意到语句是否有意义。当然也可以把 k 声明为易变的 (" volatile ")(不过这样做好像没什么意义),对比以下代码。CODE:
[ 本帖最后由 xieyi 于 2008-7-18 08:54 编辑 ]uint8 keyGet()
{
uint8 k;
P1|=0x07;
k=P1;
k<<=1; //影响了CY,所以此句编译了
if(!CY) return 0;
k>>=1; //使用到了局部变量k,所以也编译了
if(k!=0x02) return 1;
k>>=1; //未影响k,语句被忽略
if(!CY) return 2;
return 0xFF;
}
oldkey (2008-7-18 09:24:14)
另外,啰嗦一句:汇编时期的技巧,不是C时期的优势,而是绊脚石。。。
hxh1985 (2008-7-18 15:33:29)
智能了好啥,更容易编写程序 查找错误
爆裂 (2008-7-19 17:33:26)