矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 2693|回复: 11

这个b变量有些烧脑。

[复制链接]
     
发表于 2018-3-12 20:42:26 | 显示全部楼层 |阅读模式
这个小程序里面,按正常逻辑b=1才对啊,但是仿真是实际下载到开发板上实验发现b=2,乖乖了。
b=2.jpg
     
发表于 2018-3-12 22:46:45 | 显示全部楼层
case 后应该跟break,如果没有的话会顺序执行下去,直到执行完,或遇到break
程序中b++执行了2次,所以b=2了

评分

1

查看全部评分

回复 支持 1 反对 0

使用道具 举报

     
 楼主| 发表于 2018-3-12 22:07:45 | 显示全部楼层
简燕 发表于 2018-3-12 21:03
楼主因该把你用的开发板,仿真器,开发环境都帖图做个说明.

至少应该把工程文件结构贴出来.

老哥,误会了。
我就是用普通的KEIL uVision 4软件编的这个程序,单片机开发板就是普通的51单片机,89c52单片机。
初学阶段,所以有点别扭,还望不要介怀。
回复 支持 反对

使用道具 举报

     
发表于 2018-3-12 22:24:08 | 显示全部楼层
case  后没有break的话会继续执行到下一条语句.

建议楼主利用C51的仿真功能学会单步跟踪/变量查看等等
不建议用51系列入门, 51系列不能在线调试, 很不方便, 初学者会有很多困惑
AVR/ARM等等新的单片机都可以在线调试 / 跟踪运行情况 / 查看实时数据......

评分

1

查看全部评分

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-3-12 22:50:20 | 显示全部楼层
haisens 发表于 2018-3-12 22:46
case 后应该跟break,如果没有的话会顺序执行下去,直到执行完,或遇到break
程序中b++执行了2次,所以b=2了

我用keil进行模拟时跟踪这个b变量,的确发现是这样经过case(0)的时候加一了,然后经过下一个case(5)的时候又加一了,所以b=2了,但是奇怪,case(5)里面的数值是5,按理5和b变量内的值不一致,条件判断不成立,应该不会执行case(5)后面的b++才对啊,老师指导下。
回复 支持 反对

使用道具 举报

     
发表于 2018-3-12 23:01:40 | 显示全部楼层
按你的思路,正确的写法如下:
int main(void)
{
  unsigned char b =0;
    switch(b)
    {
      case(0):
              b++;
              break;
      case(5):
              b++;
              break;
      default:break;
    }
    while(1)
}
回复 支持 反对

使用道具 举报

     
发表于 2018-3-12 23:25:14 来自手机 | 显示全部楼层
就是楼上老师所说的,这是个很基础的语法问题,case几只是一个标签位置,在switch那里一次性判断然后跳转到标签就不理了,也就是说不包跳回,如果你没用break跳出去,它就会顺序执行下去。
回复 支持 反对

使用道具 举报

     
发表于 2018-3-12 23:27:37 | 显示全部楼层
本帖最后由 壹法拉 于 2018-3-12 23:29 编辑

7楼正解!
case 是与 switch 配合的;
楼主的意思是 case(5)能自己判断;那它就与 if(b==5)一样了,就没必要用 switch 了;
况且 switch case 语句编译后的代码量还比相同数量的 if 语句大得多;
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-3-13 00:09:22 | 显示全部楼层
无敌吴刚 发表于 2018-3-12 23:25
就是楼上老师所说的,这是个很基础的语法问题,case几只是一个标签位置,在switch那里一次性判断然后跳转到 ...

我还不是不大明白,
switch(2)
case(2):i++;
case(5):i++;
应该switch后面的值是2,那么应该只会执行case2后面的语句,因为2和2一致,成立,就算执行到case5这里,因为2和5不一致,应该不会执行case5后面的i++啊。
还是不懂啊。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-3-13 00:09:44 | 显示全部楼层
壹法拉 发表于 2018-3-12 23:27
7楼正解!
case 是与 switch 配合的;
楼主的意思是 case(5)能自己判断;那它就与 if(b==5)一样了,就没 ...

我还不是不大明白,
switch(2)
case(2):i++;
case(5):i++;
应该switch后面的值是2,那么应该只会执行case2后面的语句,因为2和2一致,成立,就算执行到case5这里,因为2和5不一致,应该不会执行case5后面的i++啊。
还是不懂啊。
回复 支持 反对

使用道具 举报

     
发表于 2018-3-13 00:30:43 | 显示全部楼层
生鱼片 发表于 2018-3-13 00:09
我还不是不大明白,
switch(2)
case(2):i++;

CASE 2 或 CASE 5 仅仅是一个标号(标记);没有计算或判断作用;
这有点象 GOTO 语句用到的标号;如 goto MARK; 中的 MARK;

当程序走到 CASE 语句后会执行 CASE 后面的语句,直到遇到 BREAK;

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2018-3-13 01:02:25 | 显示全部楼层
本帖最后由 生鱼片 于 2018-3-13 01:15 编辑
壹法拉 发表于 2018-3-13 00:30
CASE 2 或 CASE 5 仅仅是一个标号(标记);没有计算或判断作用;
这有点象 GOTO 语句用到的标号;如 g ...

总算明白了,感谢上面所有老师的付出,谢谢。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-5-2 03:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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