《编写高质量代码:改善c程序代码的125个建议》——建议17-3:避免在if/else语句后面添加分号“;”

简介:

本节书摘来自华章计算机《编写高质量代码:改善c程序代码的125个建议》一书中的第3章,建议17-3,作者:马 伟 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

建议17-3:避免在if/else语句后面添加分号“;”

在C语言中,只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句,常常被用来作为空循环体。如果你不小心在if/else 语句后面添加了分号“;”,那么程序将很容易违背你的意愿,导致意外的运算结果,如下面的示例代码所示:

int main (void)
{
    int x=1;
    if(x<0);
    x++;
    printf("%d\n",x);
    return 0;
}

在上面的代码中,语句x++ 并不是在“if(x<0)”为真的时候才被调用,而是任何时候都会被调用,所以最后变量x的值为2。这究竟是怎么回事呢?
其实,问题就出在if 语句后面的分号“;”上。我们知道,在C 语言中,分号预示着一条语句的结尾。但值得注意的是,并不是每条C 语言语句都需要分号作为结束标志。比如,if 语句的后面就并不需要分号,但如果你不小心添加了分号,编译器并不会提示出错。因为编译器会把这个分号解析成一条空语句,即上面的代码等价于下面的代码:

int main (void)
{
    int x=1;
    if(x<0)
    {
            ;
    }
    x++;
    printf("%d\n",x);
    return 0;
}

其实,这种手误性错误是我们很容易犯的,往往一不小心多写了一个分号,就会导致结果与预想的相差很远。因此,建议大家使用NULL来替代空语句,这样做可以明显地区分真正必需的空语句和不小心多写的分号造成的误解,如下面的示例代码所示:

int main (void)
{
    int x=1;
    if(x<0)
            NULL;
    x++;
    printf("%d\n",x);
    return 0;
}
相关文章