查看原文
其他

C语言中一个括号引发的……

薛定谔的coding猫 脚本之家 2022-04-23

  脚本之家

你与百万开发者在一起

公众号:C语言编程

作者:薛定谔的coding猫

今天给大家带来一个比较典型的问题,一个小括号引发的bug,问题虽小但值得注意。

首先来看如下代码

if (x == 0) if (y == 0) error();else{ z = x + y;}

在上面这段代码中,作者的本意是处理两种情况x等于0以及x不等于0,对于x等于0的情况,如果y也等于0,就调用error()函数。如果x不等于0,首先求出x和y的和,然后赋值给z。

然而,上面这段代码实际上所做的却和编程者的意图相去甚远。

原因在于C语言中有这样的规则:else始终优先匹配同一对括号中最近未匹配的if。如果我们按照程序实际执行的逻辑来调整代码的缩进,那么代码实现的功能大致如下:

if (x == 0) { if (y == 0) error(); else { z = x + y; }}

观察上面的代码可以发现,如果x不等于0,程序不会进行任何处理。如果程序等于0,会进一步根据y的值是否为0进行处理。

如果我们想得到原来的例子中由代码缩进体现的编程者的本意,我们应该这样写这个函数。

if (x == 0) { if (y == 0) error();} else { z = x + y;}

现在else与第一个if正确匹配,即使它距离第二个if更近也是如此,因为此时第二个if已经被括号封装起来了。

一个小小的括号就会完全改变程序的执行流程,从这个例子中我们可以看出,不要随意省略括号是良好的编程习惯,请大家以后注意,感谢耐心阅读!

- END -
点击卡片进入小程序,签到赢礼品
👇🏻👇🏻👇🏻

(更多精彩值得期待……)

●  脚本之家粉丝福利,请查看 

●  人人都欠微软一个正版? 

●  C 语言漏洞最严重,PHP 最易受攻击,程序员该怎么写代码?

● 这才是你需要的C语言、C++学习路线!

 C语言写个贪吃蛇游戏

● C语言获得“2019 年度编程语言”称号

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存