bool类型匹配了字符串

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源

运行环境: win7 x64 + vs2008

不知道大家是否碰到过这样一个问题:

传递参数时使用类似,_T(“12344”)或”1234”这种形式时,在C++中,会先匹配bool类型的参数,然后才会考虑匹配String参数。

这个结果可能有些出乎意料: 例如下面的这段代码


void Proc(CString sText)

{

CString sPrompt;

sPrompt.Format(_T("Call Proc CString, valus = %s"), sText);

AfxMessageBox(sPrompt);

}

void Proc(bool b)

{

CString sPrompt;

sPrompt.Format(_T("Call Proc bool, value = %d"), b);

AfxMessageBox(sPrompt);

}

void CTestCStrArgDlg::OnBnClickedButtonCheck()

{

// TODO: 在此添加控件通知处理程序代码

Proc(_T("0"));

Proc(_T("1"));

Proc(_T("100"));

Proc(CString(_T("0")));

Proc(CString(_T("1")));

Proc(CString(_T("100")));

}

运行的结果如下,也就是只有显示的指出参数是CString类型时,才会直接匹配CString类型参数的函数。

Call Proc bool, value = 1

Call Proc bool, value = 1

Call Proc bool, value = 1

Call Proc CString, value = 0

Call Proc CString, value = 1

Call Proc CString, value = 100

当然了,在vs2008中,为bool类型赋值字符串竟然也是允许的,下面这么写编译没有任何问题

bool a = "0";

bool b = _T("1");

但是如果改成int/BOOL/DWORD/char型,就立即会报错了:

error C2440: “初始化”: 无法从“const char [2]”转换为“BOOL”

针对这个问题,我理解成这样:

类似这种“1234”字符串,实际返回的一个字符串的地址,赋值给bool型,意味着判断地址是否为空,所以此时始终获取到true这个值。

针对这种猜测,我简单验证了一下:

TCHAR* pStr = _T("1234");

Proc(pStr);

这样写之后,会收到vc2008的一个警告--重编时这个警告就不见了

warning C4800: “TCHAR *”: 将值强制为布尔值“true”或“false”(性能警告)

运行结果是: Call Proc bool, value = 1

TCHAR* pStr = NULL;

Proc(pStr);

运行结果是: Call Proc bool, value = 0

基于上面两个测试,可以看出,地址参数在传递给bool型时,被转换为地址为空判断了。

所以,后续在使用bool型参数的时候,也或在使用字符串参数的时候,要特别注意了,尽可能指明类型,否则可能出现非预期的结果。

Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 转载请标明来源

时间: 2024-12-08 11:13:01

bool类型匹配了字符串的相关文章

OC-关于BOOL类型的一小点新“姿势”

以前判断BOOL类型之后,都会傻逼的返回1或者0来接受,实在是不美观, 但是用switch或者if语句都是比较麻烦的, 下面利用一下三目运算符,才是王道啊 //首先创建一个字符串 NSString *str = @"welcome to beijing"; //用BOOL类型判断该字符串是否以字符串"wel"开头(仅仅是举个例子,BOOL才是重点) BOOL isPrefix = [str hasPrefix:@"wel"]: //BOOL类型的

JavaScript基础 空字符串:string 类型,转成bool类型是 :false Boolean()系统函数

镇场诗: 清心感悟智慧语,不着世间名与利.学水处下纳百川,舍尽贡高我慢意. 学有小成返哺根,愿铸一良心博客.诚心于此写经验,愿见文者得启发.------------------------------------------ code: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=ut

python中int类型、bool类型补充,及字符串的部分常用方法

一.int类型 bit_length() 返回一个数的二进制长度 二.bool类型 布尔只有两个值. True,False. 一般是没有什么操作的. 所有的空都是False,所以的非空都是True 三.str类型 由',",''', """阔起来的内容就是字符串 字符串是不可变的数据类型.不论你执行任何操作. 源字符串是不会改变的, 每次操作都会返回新字符串 1. 索引和切片 索引从0开始, 使用[下标]可以获取到每一个字符, 还可以倒着数 切片: [起始位置:结束

C++ Primer 学习笔记_15_从C到C++(1)--bool类型、const限定符、const与#define、结构体内存对齐

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢 一.bool类型(C语言没有) 1.逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节. 2.声明方式:bool result; result=true; 3.可以当作整数用(true一般为1,false为0) 4.把其它类型的值转换为布尔值时,非零值转换为true,零值转换为false 5.示例 #include <iostream> using namespace

拼接json时小心C#中bool类型转化

C#中bool类型的值,在ToString时会有如下转化:true—>Ture ; false—>False这是拼接到json串中就会出现如下结果:{ "no": "001", "name": "yueye", "age": 32, "isStudent": True } 这种数据在android中进行解析,没有出现什么问题(没有详细进行了解)但是在ios中进行解析的话,无法

object-c中的BOOL类型

object-c中的布尔类型比C语言中的bool类型早了10年,它具有YES和NO两种值.在object-c中的布尔类型BOOL实际上是一种带符号的字符类型(signed char),它使用的空间是1byte,即8bit,其中YES定义为1,NO定义为0.将大于1字节的整形数(比如short或者int)赋给BOOL变量,会被截断处理,只保留末尾的8个bit. 以下是object-c中使用BOOL类型的例子: #import <Foundation/Foundation.h> //比较两个int

JSON 的数据类型 以及传递bool类型数据的处理方式

ajax中使用json传递数据时,其它数据类型都不是问题,但是如果服务器端生成的JSON中有bool类型的数据时,到客户端解析时出现了小小的问题,总结如下: 服务器返回的JSON为: 代码如下: {"TypeID":[1037],"Title":"河北软件职业技术学院","Intro":"","IsLink":"false","LinkUrl":&

Long型070000L前面0去掉比较大小,token,mysql innodb,properties,switch匹配空字符串对象

public class TestJava { //定义获取资源文件 private static final ResourceBundle bundle = initBundle(); private static ResourceBundle initBundle(){ return ResourceBundle.getBundle("conf/chinapay", Locale.CHINA); } //键值对 private final static String MERID_U

int 和 str bool 类型

1 int类型 int > str 2 bool类型 3  str类型 1) upper() 改为大写 例如: s = "sjdklsk" s1 =s.upper(s) print(s1) 结果:SJDKLSK 2)lower() 改为小写 例如: s = "SjDklsK" s1 = s.lower(s) print(s1) 结果:sjdklsk 3) replace() 替换 s = "小猪佩奇,胡图图,旅游" s1 = replace