“悬挂式条件”引发的“血案”

这个问题虽然已经为人熟知,而且也并非c语言所独有,但即使是有多年经验的c程序员也常常在此失误过。
考虑下面的程序片段:

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

这段代码中编程者的本意是应该有两种主要情况,x==0 以及 x!=0,然而,这段代码实际上所做的却与编程者的意图相去甚远。原因在于C语言中有这样的规则,else 始终与同一对括号内最近的未匹配的 if 结合。如果我们按照上面这段程序实际上被执行的逻辑来调整代码缩进,大致是这个样子:

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

悬挂式条件 估计稍微一点经验的编程者都理解这个理论基础,但很多时候却”防不胜防“,因为出现这种出乎意料的 悬挂式条件 写法并非编程者开始设计的模样,往往是通过代码整合(源码管理时代码合并、解决冲突等)时引入的,静悄悄而又隐蔽的出现,而造成的后果往往是崩溃性的。

你可能感兴趣的:(嵌入式开发过程中躺过的那些坑,c语言)