[51单片机] 初学者。关于 if else的。

[复制链接]
1927|21
 楼主| xlpc 发表于 2020-8-23 17:14 | 显示全部楼层 |阅读模式
本帖最后由 xlpc 于 2020-8-23 17:17 编辑

#include<reg52.h>
#define uint unsigned int

uint x=0,y=0 ;

void main()
{               
        x=6;
        if     (x> 10) y=5 ;
        else if (x> 5) y=4;            
        else if (x> 3) y=3;            
}
   
代码如上, 因为在一个程序中要对变量进行分段判断并赋值,但是写了都不对。就单独建立了个工程,来观察一下。然后在 keil调试时,watch窗口里看到的变量数据会不对。
比如上面 x=6时,y=4才对。窗口里显示是2.不是为啥。
共轭富数 发表于 2020-8-23 17:41 来自手机 | 显示全部楼层
你x等于6时,既满足大于5,也满足大于3,机器当然不知道y等于多少了。你在第二条判断加上x小于等于10,第三条加上小于等于5才行
copower 发表于 2020-8-23 18:02 | 显示全部楼层
  1. void main()
  2. {               
  3.         x=6;
  4.         if (x> 10) y=5 ;
  5.         else if (x> 5) y=4;            
  6.         else if (x> 3) y=3;   
  7.         while(1);         
  8. }

你截图看运行到while(1);的时候 y 的值是多少。


另外不要省略括号,好习惯受用一生,不好的习惯说不定哪天暴雷后悔莫及。
  1. void main()
  2. {               
  3.         x=6;
  4.         if (x> 10){
  5.             y=5 ;
  6.         }
  7.         else if (x> 5){
  8.             y=4;  
  9.         }           
  10.          else if (x> 3){
  11.               y=3;
  12.         }            
  13. }
比神乐 发表于 2020-8-23 18:56 | 显示全部楼层
应该在最好加个死循环
ayb_ice 发表于 2020-8-24 08:21 | 显示全部楼层
结束了,程序跑飞了
 楼主| xlpc 发表于 2020-8-24 09:22 | 显示全部楼层

没运行前。

运行后。。这个x=4是哪来的,想不通。还有左下的提示是啥意思。
编译时并没有错误。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| xlpc 发表于 2020-8-24 09:23 | 显示全部楼层
共轭富数 发表于 2020-8-23 17:41
你x等于6时,既满足大于5,也满足大于3,机器当然不知道y等于多少了。你在第二条判断加上x小于等于10,第三 ...

if else 他不是满足了if的条件。他就不是就不执行else的对比了吗?
simonliu009 发表于 2020-8-24 12:43 | 显示全部楼层
本帖最后由 simonliu009 于 2020-8-24 12:45 编辑

你不要watch啊,直接printf不行吗另外,你6楼的括号位置不对.....仔细看看别人贴的和你的有啥区别
xyz549040622 发表于 2020-8-24 14:49 | 显示全部楼层
本帖最后由 xyz549040622 于 2020-8-24 14:53 编辑

仔细看你的代码,明显括号少了一个?
还有楼上说的,你不要条件同时满足两个else。
可以这么写
if((x>5)&&(x<=10))
{
}
 楼主| xlpc 发表于 2020-8-24 14:55 | 显示全部楼层
xyz549040622 发表于 2020-8-24 14:49
仔细看你的代码,明显括号少了一个?
还有楼上说的,你不要条件同时满足两个else。
可以这么写

感谢版主,,代码运行,还是有问题,不知道是不是我的keil有问题,还是怎么的?用了你的方法加了双对比单纯用if,没有用else嵌套来做。现在程序没有问题了。。
比神乐 发表于 2020-8-24 14:57 | 显示全部楼层
xlpc 发表于 2020-8-24 09:22
没运行前。

运行后。。这个x=4是哪来的,想不通。还有左下的提示是啥意思。

把while加在最后,仿真,停在while那,看y=?
 楼主| xlpc 发表于 2020-8-24 14:59 | 显示全部楼层
结贴,结贴。。基实只是做个孩子学校的科技制作,把N年前的学的拿出来再弄弄。。用的是现成的模块,然后对回传的数据判断,再做相应动作。。。代码是简单的,主要是串口通讯,数据发送,接收处理这块。在这个坛子里学到很多。
比神乐 发表于 2020-8-24 15:02 | 显示全部楼层

看,就是4.
你那种写法没错。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评论

keil有些版本有问题  发表于 2020-8-25 09:46
@xyz549040622 :谢谢  发表于 2020-8-24 15:33
为测试精神点赞。  发表于 2020-8-24 15:07
xyz549040622 发表于 2020-8-24 15:03 | 显示全部楼层
xlpc 发表于 2020-8-24 14:55
感谢版主,,代码运行,还是有问题,不知道是不是我的keil有问题,还是怎么的?用了你的方法加了双对比单 ...

不认为是keil的问题,if--else肯定是支持的,希望你继续调试,直至找到问题。单步调试看看。

wzm045 发表于 2020-8-24 15:03 | 显示全部楼层
编译器优化掉了,你要引用下一变量y
xyz549040622 发表于 2020-8-24 15:07 | 显示全部楼层
比神乐 发表于 2020-8-24 15:02
看,就是4.
你那种写法没错。

当然,楼主的写法一点错也没有。刚开始只是缺少了while而已,导致跑飞了,如果跑飞了,这种写法就会导致出现2的情况。错误都是累积的。
所以最好在书写的时候就规范,考虑到各种情况。
xyz549040622 发表于 2020-8-24 15:07 | 显示全部楼层
比神乐 发表于 2020-8-24 15:02
看,就是4.
你那种写法没错。

当然,楼主的写法一点错也没有。刚开始只是缺少了while而已,导致跑飞了,如果跑飞了,这种写法就会导致出现2的情况。错误都是累积的。
所以最好在书写的时候就规范,考虑到各种情况。
hobbye501 发表于 2020-8-25 14:39 | 显示全部楼层
watch太快了  你多加几个NOP 或者延时 打断点看看
isageko 发表于 2020-8-26 13:18 | 显示全部楼层
谢谢老哥
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部