标题: 请教C语言if语句执行逻辑问题 [打印本页]

作者: xiaoyuxinke    时间: 2022-10-24 15:08
标题: 请教C语言if语句执行逻辑问题
单片机源程序如下:
void SpeakerDiDi2(void)
{                                             //以程序每循环一次的时间为延时,蜂鸣器鸣的时间长短可改变i变量的值来调整。
   u8 i;                                     //定义一个8位变量(这里如果单片机运行速度过快或晶振用的较大,可改为16位变量定义)
   Speaker=0;                           //这里蜂鸣器响(一定执行)
   if (i<200)     {i++;}               //如果i小于200,i++。                                                            else if (i=200)  {Speaker=1; i=0;}   //不然如果i=200,蜂鸣器关闭,变量清零。
}


想明白 if(i<200)  {i++;}这里的i++,是程序每扫完一遍加1,还是停在这里一直加到200才转去执行下一句。
我想实现的意思是,程序运行一遍i才加1,i=200就相当于程序运行了200次,使用程序循环变量次的时间做延时,又不太影响系统其它程序运行。
本人初学菜鸟,多谢各位大神。









作者: pcbboy    时间: 2022-10-24 17:18
加一次就出去了,直到满足条件i>=200就不循环了。
作者: 188610329    时间: 2022-10-24 17:32
你需要了解:
for(i=0;i<200;i++){;}  的另一种写法:  for(;i<200;){i++;}

已经了解:
if(i<200)  {i++;}

for(;i<200;){i++;}
的区别。
作者: xiaoyuxinke    时间: 2022-10-24 18:55
pcbboy 发表于 2022-10-24 17:18
加一次就出去了,直到满足条件i>=200就不循环了。

感谢您的回复,意思就是说程序扫到这里只加1,然后顺序往下执行,下次程序再扫到这里再加1,一直加到200这里就不再循环了么(简单说就是程序跑了200次,这里才加够是么)
作者: 一事无成    时间: 2022-10-24 22:58
一步步来
void SpeakerDiDi2(void)
{
u16 i;  //整点报时延时
{
          Speaker=0;//一定执行
    if(i<200)  {i++;}//如果i<200则执行i++;
    Speaker=1;//一定执行
          if(i>0)    {i--;}//如果i>0则执行i--;
}
}
这个函数应该是有问题的,少了循环吧,不然中间的{}没必要,进一次函数就定义一次i,而且只要i在0<i<200,那i++又i--,执行完了i值不变,而且每次重复定义i,自动赋值为0的话,那每次只有i--不执行,是不是漏了代码?
作者: 黄youhui    时间: 2022-10-25 08:42
xiaoyuxinke 发表于 2022-10-24 18:55
感谢您的回复,意思就是说程序扫到这里只加1,然后顺序往下执行,下次程序再扫到这里再加1,一直加到200 ...

你的i是局部变量,每次进来都会被初始化一次。你可以百度关键字static或者全局变量和局部变量的区别
作者: 黄youhui    时间: 2022-10-25 08:43
188610329 发表于 2022-10-24 17:32
你需要了解:
for(i=0;i

他需要全局变量或者静态变量  
作者: 爱德华    时间: 2022-10-25 09:17
一事无成 发表于 2022-10-24 22:58
一步步来
void SpeakerDiDi2(void)
{

感觉函数实现意思应该和你想得到结果有出入吧。
作者: coody_sz    时间: 2022-10-25 11:28
每运行一次这条语句就+1.for或while循环才是循环加到满。
作者: pcbboy    时间: 2022-10-25 13:47
xiaoyuxinke 发表于 2022-10-24 18:55
感谢您的回复,意思就是说程序扫到这里只加1,然后顺序往下执行,下次程序再扫到这里再加1,一直加到200 ...

真的看错了,你的源程序是一直加到200才退出, 以为你这个是for(;i<200;){i++;} ,其实你这个if(i<200)  {i++;} 就是简单的条件,小于200就一直加到200才退出。如果这是你的原意,因该要加个延时才有效果:if(i<200)  {i++;  delay();} .
作者: wing_s    时间: 2022-10-25 16:16
for语句是循环语句,if是条件选择语句,在这里只会执行一次就顺延往下执行了(也就是i加一次1之后),不会循环扫描。
作者: Sean_Shao    时间: 2022-10-26 18:17
单步调试 用起来 你就能知道 程序是否按照你的意愿在走。。。

另外 提问题时 先把需求说清楚 然后再展示 自己的解决方案 这样人家才知道你的解决方案正确与否 说实在的 你的问题 我看起来 就是一头雾水 无法明白
作者: 2tafvw    时间: 2022-10-26 18:42
加1后继续往下执行,不过由于大循环再次到if时会继续加1直到不满足小于200的条件
作者: hondephy@126.co    时间: 2022-10-26 21:58
i++ =( i = i + 1);
作者: xiaoyuxinke    时间: 2022-10-27 08:39
2tafvw 发表于 2022-10-26 18:42
加1后继续往下执行,不过由于大循环再次到if时会继续加1直到不满足小于200的条件

感谢您的回复,我可不可以认为,其实这样的延时并不占用单片机多少时间,
作者: xiaoyuxinke    时间: 2023-3-11 14:36
一事无成 发表于 2022-10-24 22:58
一步步来
void SpeakerDiDi2(void)
{

我是新手,不是漏了,是没写好,是这样的,您说的没错,感谢您的支持!代码重新写过。




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