标题: 关于for循环内层循环变量赋值的问题 [打印本页]

作者: 巴啦啦小柯南    时间: 2018-1-31 20:16
标题: 关于for循环内层循环变量赋值的问题
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^7;
sbit dula=P2^6;
uchar num;
uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};
void delayms(uint);
void main()
{
     wela=1;
     P0=0xc0;
     wela=0;
     while(1)
     {  
         for(num=0;num<16;num++)
         {
               dula=1;
               P0=table[num];
               dula=0;
               delayms(500);
  
          }
     }
}
void delayms(uint xms)
{
     uint i,j;
     for(i=xms;i>0;i--)
         for(j=110;j>0;j--);
}
代码如上
debug的时候运行到delayms函数 j 就被赋初值0,而且在运行第二层for循环时不会被赋值110,这是什么原因?


作者: l6931639    时间: 2018-2-1 01:57
空函数被优化了,建议你做防止编译器优化的处理
作者: luoluoluo136    时间: 2018-2-1 11:13
l6931639 发表于 2018-2-1 01:57
空函数被优化了,建议你做防止编译器优化的处理


这个程序没有空函数,不存在哪个东西被优化的情况。这个问题的点不在与编译器优化。详看我下面的解释。
作者: luoluoluo136    时间: 2018-2-1 11:14

首先我们得明白keil中单步调试的含义,keil的单步调试是执行一次该行。
然后,我们得明白.C文件中的一行,编译以后实际上是很多的汇编指令。
而我们调试后的汇编窗口中,它的一行只包含一个汇编指令。

最后,我们明白了,楼主在调试的时候,光标是在.c文件中,所以,当他按下“单步调试”这个按钮时,执行的是很多条汇编指令,在执行完这些汇编指令后,j的值又变成了0,所以会出现误以为0的值没有变化这个误解。

建议楼主调试时,把光标放在汇编指令窗口,那么,每次按下“单步调试”这个按钮的时候,就能清楚看到每个变量的变化了!


作者: luoluoluo136    时间: 2018-2-1 11:16
void delayms(uint xms)
{
        uint i,j;
        for(i=xms; i>0; i--)
                for(j=110; j>0; j--)
                {
                        ;
                }
}
楼主的程序改成这样,把程序分行,那么当光标在.c文件中时,也能清楚看到j的变化了。
作者: luoluoluo136    时间: 2018-2-1 11:17
最后,如果两位有疑问,可以加我一起讨论。
作者: cccc888    时间: 2018-2-1 13:12
光标对应当前行的c语言源码,反汇编后的行首。

作者: l6931639    时间: 2018-2-1 17:11
luoluoluo136 发表于 2018-2-1 11:14
首先我们得明白keil中单步调试的含义,keil的单步调试是执行一次该行。
然后,我们得明白.C文件中的一行 ...

谢谢,原来还有这样的说法,我之前没有碰到过




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1