找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3185|回复: 7
打印 上一主题 下一主题
收起左侧

关于for循环内层循环变量赋值的问题

[复制链接]
跳转到指定楼层
楼主
ID:281273 发表于 2018-1-31 20:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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,这是什么原因?

评分

参与人数 1黑币 +5 收起 理由
andmine + 5

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:212177 发表于 2018-2-1 01:57 来自手机 | 只看该作者
空函数被优化了,建议你做防止编译器优化的处理
回复

使用道具 举报

板凳
ID:97438 发表于 2018-2-1 11:13 | 只看该作者
l6931639 发表于 2018-2-1 01:57
空函数被优化了,建议你做防止编译器优化的处理


这个程序没有空函数,不存在哪个东西被优化的情况。这个问题的点不在与编译器优化。详看我下面的解释。
回复

使用道具 举报

地板
ID:97438 发表于 2018-2-1 11:14 | 只看该作者

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

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

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

回复

使用道具 举报

5#
ID:97438 发表于 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的变化了。
回复

使用道具 举报

6#
ID:97438 发表于 2018-2-1 11:17 | 只看该作者
最后,如果两位有疑问,可以加我一起讨论。
回复

使用道具 举报

7#
ID:258566 发表于 2018-2-1 13:12 | 只看该作者
光标对应当前行的c语言源码,反汇编后的行首。
回复

使用道具 举报

8#
ID:212177 发表于 2018-2-1 17:11 来自手机 | 只看该作者
luoluoluo136 发表于 2018-2-1 11:14
首先我们得明白keil中单步调试的含义,keil的单步调试是执行一次该行。
然后,我们得明白.C文件中的一行 ...

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表