OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3241|回复: 8

关于按键实验中,return语句的位置问题。

[复制链接]

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-5-22
在线时间
9 小时
发表于 2018-5-22 20:13:25 | 显示全部楼层 |阅读模式
5金钱
我用的是精英板。
在看了相关教学视频和资料后,我尝试着自己写了一个代码,用于验证自己是否已经掌握了该程序。
但是,在实际的编程过程中,我发现了如下一个问题。
int scankey(int mode)
{
        static int a=1;
        if(mode==1) a=1;
        if(a==1&&(key0==0||key1==0||key_wake_up==1))
        {
                delay_ms(10);
                a=0;
                if(key0==0) return key0_press;
                else if(key1==0) return key1_press;
                else if(key_wake_up==1) return key_wake_up_press;
        }
        else
                if(key0==1&&key1==1&&key_wake_up==0)
        //        {
                        a=1;
                        return 0;
        //        }
}

如上面所示的代码。我把最后面的一组大括号给注释掉了。
我的理解是,如果说不加大括号,那么整个函数的最后一个执行的代码肯定就是return 0这一句。这样一来,之前的if语句中的return语句不就什么用都没有了吗?
于是,我就加了一个大括号。然后编译的时候,给了我一个警告,所我没有加return语句(黑人问号)。紧接着,但我把程序烧入芯片之后开始运行时,现象开始不对劲了。
wake up 的那个按键没办法正常运行,其他的两个按键正常。
然后,我把大括号去掉,程序就能正常运行了。那么,我的思路到底哪儿错了呢?为什么加上这个大括号之后,编译时会出现警告,并且实验现象会出错呢?
劳驾各位大神指点一下。

最佳答案

查看完整内容[请看2#楼]

加上大括号肯定会有警告,因为你的if没有包含所有的情况,所以函数在某些情况下会没有return值!调用函数后就有可能会出现错误。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7568
金钱
7568
注册时间
2016-11-30
在线时间
643 小时
发表于 2018-5-22 20:13:26 | 显示全部楼层
加上大括号肯定会有警告,因为你的if没有包含所有的情况,所以函数在某些情况下会没有return值!调用函数后就有可能会出现错误。
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2017-5-18
在线时间
20 小时
发表于 2018-5-22 23:05:09 | 显示全部楼层
我也刚好学到这里,试着分析一下
1. 如果说不加大括号,那么整个函数的最后一个执行的代码肯定就是return 0这一句
    函数应该是执行到return 就返回了,不一定执行到最后一句.
2 然后编译的时候,给了我一个警告,所我没有加return语句(黑人问号)。
..\hardware\KEY\key.c(42): warning:  #940-D: missing return statement at end of non-void function "KEY_Scan"
这应该是说非void类型函数 不能缺return语句
3.并且实验现象会出错呢?
我试了一下,实验没问题,三个按键都正常
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-5-22
在线时间
9 小时
 楼主| 发表于 2018-5-23 20:37:23 | 显示全部楼层
tiantian1626 发表于 2018-5-22 23:05
我也刚好学到这里,试着分析一下
1. 如果说不加大括号,那么整个函数的最后一个执行的代码肯定就是return 0 ...

实验现象正常?我的现象时在按下wake up那个按键时,红色的led灯不停使唤。然后,如果说一个函数是非void类型的函数,那么是不是只要执行到return语句,就会结束这个函数的运行过程?
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-5-22
在线时间
9 小时
 楼主| 发表于 2018-5-23 21:01:51 | 显示全部楼层
lvkanger 发表于 2018-5-23 09:30
加上大括号肯定会有警告,因为你的if没有包含所有的情况,所以函数在某些情况下会没有return值!调用函数后 ...

可是,我在加上大括号之后,在后面补上了else return 0;这一句话,编译时还是会有警告。是不是只要在有返回值类型的函数中,函数体的最后一句不是return语句的话,系统都会给出警告?
回复

使用道具 举报

3

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2018-5-22
在线时间
9 小时
 楼主| 发表于 2018-5-23 21:27:07 | 显示全部楼层
lvkanger 发表于 2018-5-23 09:30
加上大括号肯定会有警告,因为你的if没有包含所有的情况,所以函数在某些情况下会没有return值!调用函数后 ...

emmmm,在最后加上了那一句话之后,实验现象就正常了,虽然说还是会给出我没有return语句的警告。所以,您的解答应该是对的,感谢!
回复

使用道具 举报

15

主题

866

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7568
金钱
7568
注册时间
2016-11-30
在线时间
643 小时
发表于 2018-5-24 09:19:38 | 显示全部楼层
wzh1998430sr 发表于 2018-5-23 21:01
可是,我在加上大括号之后,在后面补上了else return 0;这一句话,编译时还是会有警告。是不是只要在有 ...

按说不会啊,只要你的所有if else判断下边都有return 就不会有警告了啊,只要保证了函数在任意情况下都会有相同类型的return 值就不会有警告了。建议还是最后一个return 不加任何判断。
回复

使用道具 举报

0

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
168
金钱
168
注册时间
2017-5-18
在线时间
20 小时
发表于 2018-5-30 14:49:19 | 显示全部楼层
wzh1998430sr 发表于 2018-5-23 21:01
可是,我在加上大括号之后,在后面补上了else return 0;这一句话,编译时还是会有警告。是不是只要在有 ...

我的理解是这样,碰到return,这次函数调用就结束了
回复

使用道具 举报

7

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
385
金钱
385
注册时间
2018-7-19
在线时间
126 小时
发表于 2018-7-26 17:35:26 | 显示全部楼层
就不加括号就好了啊,干嘛要加
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 22:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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