打印
[C语言]

switch和if有什么区别【已解决】

[复制链接]
4138|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xyz549040622|  楼主 | 2014-1-7 15:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xyz549040622 于 2014-1-7 17:12 编辑

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

从理论上说,两段代码达到的效果是一样的,可是实际中,如果用下面的代码,第二个if就进不去,只会执行第一个if,这两段代码有什么区别吗?
UINT8U Read_KeyBoard()
{
        static UINT8U Key_State = 0,Key_Value,Key_Hold_Time;//
        UINT8U Key_Return_Value = No_Press;
        switch(Key_State)
        {
                case 0:  //×î³õµÄ״̬£¬°´¼üɨÃè
//                        SendStr("Press is no!");
                        Key_Value = Key_PortIn;//
                        if(Key_Value != No_Press)//
                        {
                        Key_State++;//
                        }
                        break;
                case 1:
//                        SendStr("Press is 1 \n");
                        if(Key_Value == Key_PortIn)//
                        {
                        Key_State++;//
                        Key_Hold_Time = 0;
                        }
                        else
                        Key_State--;//
                        break;
                case 2:
                        if(Key_PortIn == No_Press)//
                        {
//                        SendStr("Press is off \n");
                        Key_Return_Value = Key_Value;//µ
                        Key_State = 0;//
                        SendByte(Key_Return_Value);
//                        TR0 = 0;
                        }
                        break;
                default : break;
        }
        return Key_Return_Value;
}



相关帖子

沙发
南宫云明| | 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
5
xyz549040622|  楼主 | 2014-1-7 17:09 | 只看该作者
南宫云明 发表于 2014-1-7 16:16
因为switch只会执行一遍Read_KeyBoard(),而分成两个if的话会执行两遍?

一语惊醒梦中人,确实是这个样子的,受教啦:lol

使用特权

评论回复
6
xyz549040622|  楼主 | 2014-1-7 17:11 | 只看该作者
ayb_ice 发表于 2014-1-7 16:29
这哪里一样,明显不一样

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

想通了,如果操作的是个函数返回值的话,的确是有影响的

使用特权

评论回复
7
NE5532| | 2014-1-7 17:12 | 只看该作者
呵呵,楼主要是把Read_KeyBoard()的返回值赋给一个变量,然后用If判断这个变量,跟switch得到的结果不同,才要抠脑袋呢。

使用特权

评论回复
8
xyz549040622|  楼主 | 2014-1-7 17:15 | 只看该作者
NE5532 发表于 2014-1-7 17:12
呵呵,楼主要是把Read_KeyBoard()的返回值赋给一个变量,然后用If判断这个变量,跟switch得到的结果不同, ...

是呀。。。人糊涂了就是,想一个问题,怎么都想不明白,又不能硬件仿真,只能通过串口看,无法知道到底执行到哪里去了

使用特权

评论回复
9
sfpxfpcfp| | 2014-1-7 17:34 | 只看该作者
If是条件选择, switch是伪条件选择

使用特权

评论回复
10
呆板书生| | 2014-1-7 19:29 | 只看该作者
switch是多条件选择

使用特权

评论回复
11
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去掉 就一样了。

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

使用特权

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

建议你用KEIL软仿真。只用串口的话,学习进度恐怕很慢。

使用特权

评论回复
13
xlsbz| | 2014-1-10 09:41 | 只看该作者
xlsbz 发表于 2014-1-10 09:35
楼主是什么版主?头像看起来某方面属于大神级别。

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

刚才说的不严谨。也有不一样。Read_KeyBoard()) 返回值可能会改变。比如中断里面改变了 函数Read_KeyBoard()) 里面的值。

使用特权

评论回复
14
xyz549040622|  楼主 | 2014-1-10 10:35 | 只看该作者
xlsbz 发表于 2014-1-10 09:35
楼主是什么版主?头像看起来某方面属于大神级别。

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

:lol这家伙,夸得俺心花怒放哇,俺扯淡聊天属于大神级别,哈哈

使用特权

评论回复
15
xyz549040622|  楼主 | 2014-1-10 10:35 | 只看该作者
xlsbz 发表于 2014-1-10 09:37
建议你用KEIL软仿真。只用串口的话,学习进度恐怕很慢。

说的有道理,也准备学习软仿了,用串口太慢

使用特权

评论回复
16
song-du| | 2014-3-4 20:41 | 只看该作者
:)

使用特权

评论回复
17
crazy2012| | 2014-3-5 09:26 | 只看该作者
根本就不是问题,低级问题

使用特权

评论回复
18
天朝平民| | 2014-3-5 09:31 | 只看该作者
学习了

使用特权

评论回复
19
liub_2014| | 2014-4-11 15:57 | 只看该作者
南宫云明 发表于 2014-1-7 16:16
因为switch只会执行一遍Read_KeyBoard(),而分成两个if的话会执行两遍?

楼主一言胜过万行代码啊

使用特权

评论回复
20
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 精品课全集,给你全方位的技能策划~~←←

2782

主题

19267

帖子

104

粉丝