NULL与nullptr

if(name == null)和if(null == name)有什么讲究吗?

在C语言里面,为了防止少敲一个等号,编程人员仍然能在编译的时候找到错误。因为if(name = null)在编译的时候不会出现错误,而if(null = name)是会编译出错的。故而,采用null == name这种写法。

但是在java里面,if(name = null)是会出现编译错误的。会报如下错误:
Type mismatch: cannot convert from XXX to boolean(类型匹配错误:不能从XXX转换为boolean类型)
所以在java里面不必担心这个问题。但是,良好的编程习惯,还是写成null == name的好。

NULL与nullptr的区别

NULL是什么

NULL的实质:是个宏定义
NULL在C中就是(void*)0:
NULL在C++中就是int类型的0:

#ifdef __cplusplus  
#define NULL    0  
#else  
#define NULL    ((void *)0)  
#endif  

c++不支持隐式转换

nullptr是什么

相对于NULL有了专门的类型
nullptr的类型是nullptr_t,不是int类型

#if __cplusplus >= 201103L
  typedef decltype(nullptr) nullptr_t;
#endif

相同点:
nullptr与null可以转换为任意类型的指针
不同点:
NULL不仅可以作为指针,还可以作为整数0.
但是nullptr只能是指针,不能作为0,但是仍能用做if()内判断,
它可以转换成任何指针类型和bool布尔类型(主要是为了兼容普通指针可以作为条件判断语句的写法),但是不能被转换为整数。

char *p1 = nullptr;     // 正确
int  *p2 = nullptr;     // 正确
bool b = nullptr;       // 正确. if(b)判断为false
int a = nullptr;        // error

结论

如果是c++,NULL其实就是0,而不是c中的(void *) 0,c++无法进行这种隐式隐式转换,只能进行在数值类型之间的隐式转换,int,float,double
nullptr则是一种新的类型。
由此可以避免函数重载的一些问题