C++中未初始化的bool值的问题
原创文件,欢迎阅读,禁止转载。
问题描述
你见过一个这样的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:
YES
linux的结果:
resp:
YES
NO
结果解释:
从运行结果看出,Windows没问题,如果未初始化,debug版直接中止进程。
而linux中:
如果是int类型,则0就是假,其他都是真;而bool类型却不是这样;bool类型如果未初始化,则判断真也成立,假也成立,完全是乱来。如果初始化了,不管初始化为多少,都能像int判断真假一样了。
这里说清楚了这个问题,应该算是运行库的缺陷吧。
总结:
必须有良好的编码风格,未初始化这种毛病是不能容忍的。
原创文件,欢迎阅读,禁止转载。
C++中未初始化的bool值的问题的更多相关文章
- C语言中的未初始化变量的值
C语言中未初始化的变量的值是0么 全局变量 .静态变量初始值为0局部变量,自动变量初始值随机分配 C语言中,定义局部变量时如果未初始化,则值是随机的,为什么? 定义局部变量,其实就是在栈中通过移动栈指 ...
- void指针、NULL指针和未初始化指针
一个指针可以被声明为void类型,比如void *x.一个指针可以被赋值为NULL.一个指针变量声明之后但没有被赋值,叫做未初始化指针. 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...
- c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针
1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...
- C语言的未初始化的数组的值为什么是随机的
突然想起来前几天同学问我为什么没有初始化的数组的值是随机的,发现这个困惑自己也是存在的,所以自己总结的心得. 1. 首先,并不是所有未初始化的数组的值都是随机的.对于没有初始化的数组,分两种情况: ( ...
- 根据Bool值挑选数组中元素
根据Bool值挑选数组中元素 觉得有用的话,欢迎一起讨论相互学习~Follow Me 使用Boolean类型的数组挑选一维数组中的值 使用一维Boolean数组选取数组中的特定元素,对应位置为True ...
- js中的bool值转换及"&&" 、"||"、 "!!"详解
bool值转换 数据类型 bool值转化 undefined undefined 转化为 false Object null 转化为false,其他为 true Boolean false 转化为 f ...
- 获取web.xml配置文件中的初始化值
TestServletConfig.java package com.huawei.config; import java.io.IOException;import java.util.Enumer ...
- How to: Calculate a Property Value Based on Values from a Detail Collection 如何:基于详细信息集合中的值计算属性值
This topic describes how to implement a business class, so that one of its properties is calculated ...
- C#中成员初始化顺序
http://blog.csdn.net/huangcailian/article/details/25958967 一.成员初始化整体顺序 1.成员赋值初始化先于构造函数: 2.成员赋值初始先从子类 ...
随机推荐
- 学Android开发,入门语言java知识点
学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...
- android 音频焦点
音频焦点分为两种 1永久占用((AudioManager) getSystemService(AUDIO_SERVICE)) .requestAudioFocus(null, AudioManager ...
- C#网络编程二:Socket编程
一:什么是SOCKET socket的英文原义是"孔"或"插座".作为进程通信机制,取后一种意思.通常也称作"套接字",用于描述IP地址和端 ...
- Android菜鸟成长记11 -- sqlite数据库的设计和升降级
Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLite 只需要带一个动 ...
- [知识整理]Java集合(一) - List
一.实现List的几个类: ArrayList.LinkedList.CopyOnWriteArrayList.Vector 二.几个List底层的数据结构: ArrayList - 数组列表 Lin ...
- 使用 Eclipse 插件部署 Java 应用
打开 Eclipse,点击顶部的菜单『Help/Install New Software/Add』. 选择对话框顶部『Work with』 后面的『Add』按钮,并点击『Archive』选择下载到本地 ...
- C语言获取时间
转载:http://www.cnblogs.com/fzhe/archive/2012/11/06/2757858.html C语言获取系统时间的几种方式 C语言中如何获取时间?精度如何? 1 使 ...
- iOS 根据字符串内容动态计算行高
+ (CGFloat)textHeightFromTextString:(NSString *)text width:(CGFloat)textWidth fontSize:(CGFloat)size ...
- Powershell获取并导出指定日期EventLog
$date = Get-Date 28/07/16 Get-EventLog -After $date "Application"|Export-Csv c:\ming.csv
- 第一章 删掉centos原有的openjdk并安装sun jdk
一.卸载原有openjdk rpm -qa | grep java 之后,将展示出来的全部卸载掉,我这里是5个 rpm -e --nodeps java-1.7.0-openjdk-1.7.0.111 ...