Hello Feixy

原创文件,欢迎阅读,禁止转载。

问题描述

你见过一个这样的bool值吗,判断 var 和 !var 都是成立的,今天被我遇到了,是在一个坑里遇到的。
今天调试了一个程序,发送一个网络消息,结果总是得不到回应,深入排查发现,竟然是因为一个具有4年工作经验的同事张某的不良编码风格埋下的坑,真是汗。

在C++中,bool值的随机值可能是任意的,不一定是我们以为的0/1,
而不同的系统中对bool值的判断也是搞笑。
我把代码简化一下来说明问题。

代码演示

typedef struct
{
    bool    resp;    //是否反馈
    char*     ret;    //执行结果
}ARG;

int main(int argc,char* argv[])
{
    ARG argSt;
    //argSt.resp=true;//这里的bool值不初始化
    printf("resp:%d\n",argSt.resp);

    if( argSt.resp )
    {
        puts("YES");
    }
    if( !argSt.resp )
    {
        puts("NO");
    }
}

Windows的结果:

resp:44
YES

linux的结果:

resp:112
YES
NO

结果解释:

从运行结果看出,Windows没问题,如果未初始化,debug版直接中止进程。
而linux中:
如果是int类型,则0就是假,其他都是真;而bool类型却不是这样;bool类型如果未初始化,则判断真也成立,假也成立,完全是乱来。如果初始化了,不管初始化为多少,都能像int判断真假一样了。
这里说清楚了这个问题,应该算是运行库的缺陷吧。

总结:
必须有良好的编码风格,未初始化这种毛病是不能容忍的。

原创文件,欢迎阅读,禁止转载。

posted on 2016-10-18 16:42  飞翔雨  阅读(4932)  评论(0编辑  收藏  举报