(转)null和NULL和nullptr和””区别
突然想到这个有趣的问题:C语言和C++对大小写是敏感的,也就是说null和NULL是区别对待的。NULL代表空地址,null只是一个符号。便来深究,看了很多资料,总结如下:
其实null和NULL都是字符串(没啥区别,欢迎高手纠错!),具体看它们宏定义被定义成为什么值。
在VS中NULL被定义为0,因为习惯上把宏定义的所有字符都大写,当把NULL它赋值给指针时意思为空,当然你也可以把null定义为0了,都一样。
它们都没定义时都只能叫符号了,定义后就有另外的意思了,你把0直接赋值给指针也行,只要指针指向0就为空。
其实NULL在有些编译器中是赋为0了,这时你不能再去#define定义它了,否则就重定义了!
1,NULL
NULL的定义
[cpp]
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
在C语言环境下,由于不存在函数重载等问题,直接将NULL定义为一个void*的指针就可以完美的解决一切问题。
但是在C++环境下情况就变得复杂起来,首先我们不能写这样的代码:
FILE* fp = (void*)0; //将void*直接赋值给一个指针是不合法的,编译器会报错。
我们只能这样写代码
[cpp]
FILE* fp = (FILE*)0;
// or
FILE* fp = 0;
/*
所以在C++中,NULL就被直接定义为一个整型0。在大多数情况下这并不会产生什么问题。但是万一有重载或者模板推导的时候,编译器就无法给出正确结果了。比如下面的情形:
[cpp]
voidcall_back_process(CCObject* target, void* data);
bind(call_back_process,target, NULL); // error 函数类型是void* ,但是我们绑定的是一个整型 0。
*/
2,nullptr
C++11,其中有一个是新的关键字nullptr
如果我们的编译器是支持nullptr的话,那么我们应该直接使用nullptr来替代NULL的宏定义。正常使用过程中他们是完全等价的。
模拟nullptr的实现:
某些编译器不支持c++11的新关键字nullptr,我们也可以模拟实现一个nullptr
[cpp]
const
class nullptr_t_t
{
public:
template<class T> operator T*() const {return 0;}
template<class C, classT> operator T C::*() const { return 0; }
private:
void operator& () const;
} nullptr_t = {};
#undef NULL
#define NULL nullptr_t
3,“”
“”也表示空,但是和null有很大区别:null没有分配空间,""分配了空间
String str1 = null; //str引用为空
String str2 = ""; //str引用一个空串
也就是null没有分配空间,""分配了空间,因此str1还不是一个实例化的对象,而str2已经实例化。
注意:
因为null不是对象,""是对象。所以比较的时候必须是 if(str1==null){...}和if(str2.equals("")){...}。
对象用equals比较,null用等号比较。
因此,如果str1=null;下面的写法错误:
if(str1.equals("")||str1==null){//如果str1没有值,则.... }
正确的写法是
if(str1==null||str1.equals("")){//先判断是不是对象,如果是,再判断是不是空字符串}
打个比方:一个空玻璃杯,你不能说它里面什么都没有,因为里面有空气,当然也可以把它弄成真空,null与" "的区别就象真空与空气一样。
Thanks.
源博客地址:http://blog.csdn.net/cc1949/article/details/51249555
(转)null和NULL和nullptr和””区别的更多相关文章
- NULL、0、nullptr的区别
某些时候,我们需要将指针赋值为空指针,以防止野指针. 有人喜欢使用NULL作为空指针常量使用,例如:int* p = NULL;. 也有人直接使用0值作为空指针常量,例如:int* p = 0;. ...
- NULL和nullptr的区别
//error C2665: “go”: 2 个重载中没有一个可以转换所有参数类型 #include <iostream> void go(int num) { std::cout < ...
- iOS 关于nil和Nil及null与<null>的区别
问题是这样的. NSDictionary *sample = [NSJSONSerialization JSONObjectWithData:received options:NSJSONReadin ...
- 数据库中is null(is not null)与=null(!=null)的区别
在标准SQL语言(ANIS SQL)SQL-92规定的Null值的比较取值结果都为False,既Null=Null取值也是False.NULL在这里是一种未知值,千变万化的变量,不是“空”这一个定值! ...
- iOS下nil 、NULL、 Nil 、NSNull的区别
1.nil,定义一个空的实例,指向OC中对象的空指针. 示例代码: NSString *someString = nil; NSURL *someURL = nil; id someObject = ...
- SQL中IS NOT NULL与!=NULL的区别
平时经常会遇到这两种写法:IS NOT NULL与!=NULL.也经常会遇到数据库有符合条件!=NULL的数据,但是返回为空集合.实际上,是由于对二者使用区别理解不透彻. 默认情况下,推荐使用 IS ...
- C/C++编程笔记:C语言NULL值和数字 0 值区别及NULL详解
在学习C语言的时候,我们常常会碰到C语言NULL值和数字 0 ,很多小伙伴搞不清楚他们之间的一个区别,今天我们就了解一下他们之间的区别,一起来看看吧! 先看下面一段代码输出什么: 输出<null ...
- mysql中NULL和null的区别
接触php的web开发一段时间了,在进行数据库操作的时候经常会遇到一个问题,使得同一字段在页面显示时有3种类型NULL,null以及数字,当时的解决办法是将这一字段定义为varchar类型,在插入数据 ...
- 【网络收集】MySql中IS NOT NULL与!=NULL的区别
在mysql中,筛选非空的时候经常会用到is not null和!=null,这两种方法单从字面上来看感觉是差不多的,其实如果去运行一下试试的话差别会很大!为什么会出现这种情况呢?null 表示什么也 ...
随机推荐
- 导弹拦截p1020(LIS问题)
题目描述(题目链接:https://www.luogu.org/problem/P1020) 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够 ...
- 通过JAVA反射修改JDK1.6*当中DNS缓存内容
时间 2012-05-28 17:09:03 Taobao QA Team原文 http://qa.taobao.com/?p=15523 为了实现性能压测时的域名动态绑定功能,尝试通过java反 ...
- 【Unity】关于屏幕自适应的思路
关于NGUI的屏幕自适应,大体思路可以这样做: 比如要实现在屏幕的左侧做一个长条背景: 可以看出这部分图片是和屏幕高度一致的.那么只要得到“制作时的屏幕高度”以及“当前运行屏幕高度”,求两个值的比值, ...
- P1063 计算谱半径
P1063 计算谱半径 转跳点:
- 站在巨人的肩膀上才能看得更加远[Amo]
本来只是路过,写详细一点. 我看楼主浮躁得不得了.现在什么都不要做了,先去看几遍<不要做浮躁的嵌入式工程师>这篇文章,想清楚了,再动手吧. 我做了个实例,不用ST的库来点LED,解答你的问 ...
- 【pwnable.tw】 applestore
做到这道题的时候正赶上iPhone 8上市,撒花~(虽然不知道为啥) 程序分析: 先进到main函数,比较简单. myCart位于bss段上,是一个长度为0x10. 主要的处理函数是handler函数 ...
- Windows使用Nexus搭建Maven私服
简介 Maven私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件,有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库,否则,私服请求外部的 ...
- css调试与样式优先级
如何查看一个标签的当前css样式 如上图所示 先用标签选择器选择某个标签 然后在elements区域就会自动找到该标签 然后在右侧的styles区域整个区域都是该标签的样式,从上到下是显示的优先级,被 ...
- C语言循环
C 练习实例1 #include<stdio.h> int main() { int i,j,k; printf("\n"); //此处巧妙的利用循环次数和四个相等的关 ...
- PL/SQL 找到某列都为空的列名
DECLARE CURSOR temp IS SELECT COLUMN_NAME FROM ALL_TAB_COLUMNS WHERE TABLE_NAME=Upper('xxx'); v_num ...