[C语言] switch和if有什么区别【已解决】

[复制链接]
4732|19
 楼主| xyz549040622 发表于 2014-1-7 15:45 | 显示全部楼层 |阅读模式
本帖最后由 xyz549040622 于 2014-1-7 17:12 编辑

实际使用过程中发现这么一个问题,有两段代码
  1. switch(Read_KeyBoard())
  2. {
  3.         case 0x40:
  4.          Key_ESC_Value = 1;
  5.          SendStr("ESC! \r\n");
  6.          break;
  7.         case 0x80:
  8.          Key_OK_Value = 1;
  9.          SendStr("OK! \r\n");
  10.          break;         
  11.         default : break;
  12. }
  1. if((Read_KeyBoard()) == 0x40)
  2. {
  3.          Key_ESC_Value = 1;
  4.          SendStr("ESC! \r\n");
  5. }
  6. if((Read_KeyBoard()) == 0x80)
  7. {
  8.          Key_OK_Value = 1;
  9.          SendStr("OK! \r\n");

从理论上说,两段代码达到的效果是一样的,可是实际中,如果用下面的代码,第二个if就进不去,只会执行第一个if,这两段代码有什么区别吗?
  1. UINT8U Read_KeyBoard()
  2. {
  3.         static UINT8U Key_State = 0,Key_Value,Key_Hold_Time;//
  4.         UINT8U Key_Return_Value = No_Press;
  5.         switch(Key_State)
  6.         {
  7.                 case 0:  //×î³õµÄ״̬£¬°´¼üɨÃè
  8. //                        SendStr("Press is no!");
  9.                         Key_Value = Key_PortIn;//
  10.                         if(Key_Value != No_Press)//
  11.                         {
  12.                         Key_State++;//
  13.                         }
  14.                         break;
  15.                 case 1:
  16. //                        SendStr("Press is 1 \n");
  17.                         if(Key_Value == Key_PortIn)//
  18.                         {
  19.                         Key_State++;//
  20.                         Key_Hold_Time = 0;
  21.                         }
  22.                         else
  23.                         Key_State--;//
  24.                         break;
  25.                 case 2:
  26.                         if(Key_PortIn == No_Press)//
  27.                         {
  28. //                        SendStr("Press is off \n");
  29.                         Key_Return_Value = Key_Value;//µ
  30.                         Key_State = 0;//
  31.                         SendByte(Key_Return_Value);
  32. //                        TR0 = 0;
  33.                         }
  34.                         break;
  35.                 default : break;
  36.         }
  37.         return Key_Return_Value;
  38. }



南宫云明 发表于 2014-1-7 16:16 | 显示全部楼层
本帖最后由 南宫云明 于 2014-1-7 16:17 编辑

因为switch只会执行一遍Read_KeyBoard(),而分成两个if的话会执行两遍?


不知道Read_KeyBoard()会不会有影响。。

评分

参与人数 1威望 +5 收起 理由
xyz549040622 + 5

查看全部评分

ayb_ice 发表于 2014-1-7 16:29 | 显示全部楼层
这哪里一样,明显不一样

case的顺序不影响结果,不能重复,

if先后顺序很重要,不能优化,可以重复if
...

评分

参与人数 1威望 +5 收起 理由
xyz549040622 + 5

查看全部评分

xygyszb 发表于 2014-1-7 16:38 | 显示全部楼层
Key_Value的值是从哪获取的呢?

评分

参与人数 1威望 +5 收起 理由
xyz549040622 + 5

查看全部评分

 楼主| xyz549040622 发表于 2014-1-7 17:09 | 显示全部楼层
南宫云明 发表于 2014-1-7 16:16
因为switch只会执行一遍Read_KeyBoard(),而分成两个if的话会执行两遍?

一语惊醒梦中人,确实是这个样子的,受教啦:lol
 楼主| xyz549040622 发表于 2014-1-7 17:11 | 显示全部楼层
ayb_ice 发表于 2014-1-7 16:29
这哪里一样,明显不一样

case的顺序不影响结果,不能重复,

想通了,如果操作的是个函数返回值的话,的确是有影响的
NE5532 发表于 2014-1-7 17:12 | 显示全部楼层
呵呵,楼主要是把Read_KeyBoard()的返回值赋给一个变量,然后用If判断这个变量,跟switch得到的结果不同,才要抠脑袋呢。
 楼主| xyz549040622 发表于 2014-1-7 17:15 | 显示全部楼层
NE5532 发表于 2014-1-7 17:12
呵呵,楼主要是把Read_KeyBoard()的返回值赋给一个变量,然后用If判断这个变量,跟switch得到的结果不同, ...

是呀。。。人糊涂了就是,想一个问题,怎么都想不明白,又不能硬件仿真,只能通过串口看,无法知道到底执行到哪里去了
sfpxfpcfp 发表于 2014-1-7 17:34 | 显示全部楼层
If是条件选择, switch是伪条件选择
呆板书生 发表于 2014-1-7 19:29 | 显示全部楼层
switch是多条件选择
xlsbz 发表于 2014-1-10 09:35 | 显示全部楼层
楼主是什么版主?头像看起来某方面属于大神级别。

楼主最近好像猛学C语言啊。写的格式很标准,一看未来就是高人。

---------------------

首先 swtich 和if 没啥区别 都是条件语句啊

switch
  case break
case break
default
就类似于if  ()
       elseif ()
        elseif ()
         else

--------------
switch   
  case
case
default
类似于 if()
       if()
=================



所以楼主把楼主位的贴子的break去掉 就一样了。

-------------------

xlsbz 发表于 2014-1-10 09:37 | 显示全部楼层
xyz549040622 发表于 2014-1-7 17:15
是呀。。。人糊涂了就是,想一个问题,怎么都想不明白,又不能硬件仿真,只能通过串口看,无法知道到底执 ...

建议你用KEIL软仿真。只用串口的话,学习进度恐怕很慢。
xlsbz 发表于 2014-1-10 09:41 | 显示全部楼层
xlsbz 发表于 2014-1-10 09:35
楼主是什么版主?头像看起来某方面属于大神级别。

楼主最近好像猛学C语言啊。写的格式很标准,一看未来就 ...

刚才说的不严谨。也有不一样。Read_KeyBoard()) 返回值可能会改变。比如中断里面改变了 函数Read_KeyBoard()) 里面的值。
 楼主| xyz549040622 发表于 2014-1-10 10:35 | 显示全部楼层
xlsbz 发表于 2014-1-10 09:35
楼主是什么版主?头像看起来某方面属于大神级别。

楼主最近好像猛学C语言啊。写的格式很标准,一看未来就 ...

:lol这家伙,夸得俺心花怒放哇,俺扯淡聊天属于大神级别,哈哈
 楼主| xyz549040622 发表于 2014-1-10 10:35 | 显示全部楼层
xlsbz 发表于 2014-1-10 09:37
建议你用KEIL软仿真。只用串口的话,学习进度恐怕很慢。

说的有道理,也准备学习软仿了,用串口太慢
song-du 发表于 2014-3-4 20:41 | 显示全部楼层
crazy2012 发表于 2014-3-5 09:26 | 显示全部楼层
根本就不是问题,低级问题
天朝平民 发表于 2014-3-5 09:31 | 显示全部楼层
学习了
liub_2014 发表于 2014-4-11 15:57 | 显示全部楼层
南宫云明 发表于 2014-1-7 16:16
因为switch只会执行一遍Read_KeyBoard(),而分成两个if的话会执行两遍?

楼主一言胜过万行代码啊
wangguiyuan1983 发表于 2014-9-13 00:48 | 显示全部楼层
unsigned char key =  Read_KeyBoard();
if(key == 0x40)
{
         Key_ESC_Value = 1;
         SendStr("ESC! \r\n");
}
if(key == 0x80)
{
         Key_OK_Value = 1;
         SendStr("OK! \r\n");
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2841

主题

19330

帖子

110

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