你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

C语言一个小括号引发的bug

[复制链接]
gaosmile 发布时间:2020-6-4 16:38
今天给大家带来一个比较典型的问题,一个小括号引发的bug,问题虽小但值得注意。
首先来看如下代码

  1. if (x == 0)
  2.   if (y == 0)
  3.     error();
  4. else{
  5.   z = x + y;
  6. }
复制代码

在上面这段代码中,作者的本意是处理两种情况x等于0以及x不等于0,对于x等于0的情况,如果y也等于0,就调用error()函数。如果x不等于0,首先求出x和y的和,然后赋值给z。
然而,上面这段代码实际上所做的却和编程者的意图相去甚远。
原因在于C语言中有这样的规则:else始终优先匹配同一对括号中最近未匹配的if。如果我们按照程序实际执行的逻辑来调整代码的缩进,那么代码实现的功能大致如下:

  1. if (x == 0) {
  2.   if (y == 0)
  3.     error();
  4.   else {
  5.     z = x + y;
  6.   }
  7. }
复制代码

观察上面的代码可以发现,如果x不等于0,程序不会进行任何处理。如果程序等于0,会进一步根据y的值是否为0进行处理。
如果我们想得到原来的例子中由代码缩进体现的编程者的本意,我们应该这样写这个函数。

  1. if (x == 0) {
  2.   if (y == 0)
  3.     error();
  4. } else {
  5.   z = x + y;
  6. }
复制代码

现在else与第一个if正确匹配,即使它距离第二个if更近也是如此,因为此时第二个if已经被括号封装起来了。
一个小小的括号就会完全改变程序的执行流程,从这个例子中我们可以看出,不要随意省略括号是良好的编程习惯,请大家以后注意,感谢耐心阅读!

收藏 评论3 发布时间:2020-6-4 16:38

举报

3个回答
shanji 回答时间:2020-6-4 22:06:03
感谢版主科普,期待有关于指针易引发bug的帖子
likang1202 回答时间:2020-6-5 08:38:36
谢谢分享
chinwei730 回答时间:2020-6-5 13:29:49
感谢分享

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版