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

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的帖子
李康1202 回答时间:2020-6-5 08:38:36
谢谢分享
chinwei730 回答时间:2020-6-5 13:29:49
感谢分享

所属标签

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