找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3020|回复: 20
收起左侧

关于C语言if(ms==200)和while(ms==200)

  [复制链接]
ID:64817 发表于 2020-7-14 14:28 | 显示全部楼层 |阅读模式
本人业余,实在不明白请教个位师傅:  为什么 if(ms==200)不正常,而改为while(ms==200)正常了。不都是MS等于200进去吗?

/*******************************
if(ms==200)
  {
   ms=0; s=s+1; leds=~leds;   //为了检测观察程序,加了一秒leds亮灭一次。
  }      *********/



/*******************************
while(ms==200)
  {
   ms=0; s=s+1; leds=~leds;   //为了检测观察程序,加了一秒leds亮灭一次。
  }      *********/





回复

使用道具 举报

ID:332444 发表于 2020-7-14 16:46 | 显示全部楼层
判断是要放到循环里面才能判断也就是要不停地判断,循环则是独占的直到循环完成。
回复

使用道具 举报

ID:332444 发表于 2020-7-14 16:47 | 显示全部楼层
判断是要放在循环内不停检查判断的,循环则是独占的直到循环完成。
回复

使用道具 举报

ID:64817 发表于 2020-7-14 16:58 | 显示全部楼层
xianfajushi 发表于 2020-7-14 16:46
判断是要放到循环里面才能判断也就是要不停地判断,循环则是独占的直到循环完成。

师傅,不明白if(ms==200),是ms等于200才进if里面的吗???while(ms==200),不也是ms等于200才进while里面吗,,ms为其他值时,是都不进if的while和if的吧?
回复

使用道具 举报

ID:332444 发表于 2020-7-14 17:08 | 显示全部楼层
哦,是的,变量在中断的地方计数的话,这2个表达式等同,如果主函数内单独只执行这2个表达式,而没受其它的执行语句影响。
回复

使用道具 举报

ID:332444 发表于 2020-7-14 17:15 | 显示全部楼层
举个例子:
#include "reg52.h"
unsigned char code DuLiAnJian[]={1,2,4,8,16,32,64,128,254,253,251,247,239,223,191,127};
unsigned char code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64}; //共阴0~F消隐减号
sbit k1=P1^7;
bit k = 0;
void main()
{
        unsigned char wei=0,Xd=0,Sw=0;
        unsigned int Ys=47474,Lx=0;
        while(1)
        {
                if(!k1&&!++Xd){P2=P0=255;if(++Sw>9)Sw=0;while(!k1);}
                while(!--Ys)
                {
                        P2=~smgduan[wei];
                        if(++wei>9)wei=0;
                        Ys=47474;
                }
        }
}

#include "reg52.h"
unsigned char code DuLiAnJian[]={1,2,4,8,16,32,64,128,254,253,251,247,239,223,191,127};
unsigned char code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64}; //共阴0~F消隐减号
sbit k1=P1^7;
bit k = 0;
void main()
{
        unsigned char wei=0,Xd=0,Sw=0;
        unsigned int Ys=47474,Lx=0;
        while(1)
        {
                if(!k1&&!++Xd){P2=P0=255;if(++Sw>9)Sw=0;while(!k1);}
                if(!--Ys)
                {
                        P2=~smgduan[wei];
                        if(++wei>9)wei=0;
                        Ys=47474;
                }
        }
}
这样写2个程序是一样的。
回复

使用道具 举报

ID:332444 发表于 2020-7-14 17:19 | 显示全部楼层
因为你只给出一点代码,所以不能管中窥豹。
回复

使用道具 举报

ID:332444 发表于 2020-7-14 17:21 | 显示全部楼层
我的举例上门一个就是独占的循环,下面一个就是靠主循环的,同样实行了延时功能。
回复

使用道具 举报

ID:332444 发表于 2020-7-14 17:23 | 显示全部楼层
加入把我的代码修改:
--Ys;
while(!Ys)与if(!Ys)就是等同的。
回复

使用道具 举报

ID:64817 发表于 2020-7-14 17:36 | 显示全部楼层
xianfajushi 发表于 2020-7-14 17:23
加入把我的代码修改:
--Ys;
while(!Ys)与if(!Ys)就是等同的。

首先谢啦!!☆⌒(*^-゜)v,,我还是搞不明白的是既然等同了,我IF里是不正常的,,谢了,,我基础太差 了
回复

使用道具 举报

ID:452950 发表于 2020-7-14 17:41 | 显示全部楼层
就这两段代码看的话,while只执行一次就和if功能一样了,没有什么区别,非要说区别就是if只判断一次,如果符合条件就执行一次,while先判断一次,每次执行完后会再判断一次。
不知道你说的正常与不正常分别是什么现象
回复

使用道具 举报

ID:332444 发表于 2020-7-14 17:45 | 显示全部楼层
#include "reg52.h"
void main()
{
        unsigned char wei=0,Xd=0,Sw=0;
        unsigned int Ys=47474,Lx=0;
        while(1)
        {
                if(!--Ys)
                {
                         leds=~leds;
                        Ys=47474;
                }
        }
}
这样修改就是LED取反观察,可以用if与while互换试看。
回复

使用道具 举报

ID:332444 发表于 2020-7-14 17:53 | 显示全部楼层
办公室1天几千步轻松做到,原地跑步要让内脏抖起来,每10数五指1节,3*5=150,从拇指到小指为1,再从小指到拇指,数从小指到拇指2次,再从拇指到小指,合计5次,150*5=750,每小时一次,8小时合计6000次,这样既锻炼了身体,也锻炼了思维。
回复

使用道具 举报

ID:332444 发表于 2020-7-14 17:54 | 显示全部楼层
这样运动既适量又等同于专门去跑步
回复

使用道具 举报

ID:699902 发表于 2020-7-15 11:14 | 显示全部楼层
你可以查一查if具体用用法,你这种肯定是不对的。
你可以这样改试一试
if( flag_200ms==1)
回复

使用道具 举报

ID:311846 发表于 2020-7-15 11:31 | 显示全部楼层
多看看 if语句和while语句再结合程序 多研究会就明白了,别人改的不一定适合你的
回复

使用道具 举报

ID:331263 发表于 2020-7-15 15:50 | 显示全部楼层
看看书吧,没理解呀
回复

使用道具 举报

ID:743654 发表于 2020-7-17 08:52 | 显示全部楼层
if只判断一次,接着运行下面的语句;而while先判断,执行语句运行完毕后,还要进行继续判断条件是否符合循环条件,根据判断的条件,返回执行语句或继续运行下面的程序。
回复

使用道具 举报

ID:471889 发表于 2020-7-17 09:34 | 显示全部楼层
循环语句与判断语句用好好的去理解一下!@论坛
回复

使用道具 举报

ID:64817 发表于 2020-7-17 10:46 | 显示全部楼层
cheney03 发表于 2020-7-17 08:52
if只判断一次,接着运行下面的语句;而while先判断,执行语句运行完毕后,还要进行继续判断条件是否符合循 ...

师傅可不可以细说一下:
while(1)
{
if(ms==200)
  {
   ms=0; s=s+1; leds=~leds;   //为了检测观察程序,加了一秒leds亮灭一次。
  }
if(ts==60)
  {
   ms=0; s=s+1; leds=~leds;   //为了检测观察程序,加了一秒leds亮灭一次。
  }
}
不明白IF外还有个死循环呀,IF判断完了,死循环不是会 让他接着再判断吗。。。多谢了
回复

使用道具 举报

ID:972377 发表于 2021-10-15 19:01 | 显示全部楼层
因为if是运算符是取反,0取反是非0,非0取反就是0. 作为条件判断时,就是一切非0的数都会被判断为假,只有为0时才会判断为真。 具体怎么写,一般都是根据程序的业务逻辑来决定的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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