当前位置: 首页 > 我的程序代码 > 正文

一个while的小小问题

最近东搞西搞,一下子搞X平台uboot的flash问题,一下子搞Y平台的接收YUV数据上位机,频繁切换,但都没什么主要事务,听说其他部门的人连接客户电话都计时,按任务算的。可惜自己所在部门没开通这个业务。
闲话不多说,在看代码中,发现一个while语句,怎么看总觉得有问题,又不知确切出在哪里,于是就简单写了个测试程序。
示例:

int main(void)
{
    int i = 10;
    while (i--)
    {
        printf("hello: %d\n", i);
    }
    if (i == 0)
    {
        printf("last-----------i == 0\n");
    }
    else
    {
        printf("last-----------i != 0 (%d)\n", i);
    }

    return 0;
}

实际的函数用途是做超时判断,while中有delay延时,这里不写出来。上面的例子,一般人认为最终i的值是0,但实际上即是-1。是当while判断为0时不进入循环,但此时i–还会自减。因为i–本身就是先判断i的值再自减。如果将while (i–)改为while (–i) ,i的最终结果为0。
为了防止出现问题,建议作如下判断:

int main(void)
{
    int i = 10;
    while (i--)
    {
        printf("hello: %d\n", i);
    }
    if (i<=0)
    {
        printf("timeout or sth wrong\n");
    }

    return 0;
}

有时候我觉得,大学里的C语言试题还是有点用处的,只要不过分,都能接受,也能学到点东西——只是不知道什么时候会真正觉得派上用场。像我,2010年搞了下点阵字体,结果2年后在实际工作中用上了一些知识。

李迟记于2014年5月29日

本文固定链接: http://www.latelee.org/my-library/a-little-while-problem.html

如无特别说明,迟思堂工作室文章均为原创,转载请注明: 一个while的小小问题 | 迟思堂工作室

目前暂无评论

发表评论

*

快捷键:Ctrl+Enter