以下两个条件在C++中是否相同?他们都可以接受吗?我正在使用Visual Studio 2013 Express,并使用NULL。我的程序运行良好,但在我的家庭作业上,它被关闭,因为我使用NULL而不是'\ 0'。在条件语句中使用NULL和' 0'是否相同?
if (charArray[0] == NULL)
if (charArray[0] == '\0')
以下两个条件在C++中是否相同?他们都可以接受吗?我正在使用Visual Studio 2013 Express,并使用NULL。我的程序运行良好,但在我的家庭作业上,它被关闭,因为我使用NULL而不是'\ 0'。在条件语句中使用NULL和' 0'是否相同?
if (charArray[0] == NULL)
if (charArray[0] == '\0')
NULL
是空的指针常量。 charArray[0]
可能不是指针。因此,您不应该将其与NULL
进行比较。
C++标准表示:
宏
NULL
是在本国际标准(4.10)实现定义的C++空指针常量。
允许定义包括但不限于0
,0L
,并且,在C++ 11,nullptr
。如果NULL
被定义为nullptr
,你的程序甚至不会编译。
在现代C++中,如果你想要零,你应该使用像0
或这样的文字,如果你想要空指针,你应该使用nullptr
。不应该真的使用NULL
。
谢谢。如果我要比较指针,那么我应该使用NULL吗?或者它是否仍然是不好的做法,因为NULL可以是多个定义中的任何一个? 编辑:没关系,你的编辑完美地回答了我的问题!谢谢。 – temetvince 2014-10-07 15:36:06
@temetvince最大的问题是'NULL'通常在非指针状况下工作,以至于人们会陷入不良习惯。 – 2014-10-07 15:42:42
不知道你在用什么语言(它看起来像C/C++),很难说清楚。
在C/C++中,NULL通常在包含的头文件中使用#define
语句定义。它通常被定义为0,但也许你的教师停靠你的标记,因为它理论上可以定义为其他东西?
此外,0和'\ 0'是不同的类型,即使它们具有相同的二进制表示形式,这也可能是进行区分的原因。
它将在语言的较旧标准版本(C++ 98和C++ 03)中工作,其中NULL
的合法定义仅限于具有零值的整数常量表达式。但在非指针上下文中使用NULL
只会使代码难以阅读。 NULL
应仅保留为指针上下文。
对于如何定义NULL
,C++ 11允许额外的可能性。 C++ 11中的NULL
的一些法律定义甚至不会在整数上下文中进行编译。
换句话说,NULL
绝不应该以您在代码示例中使用它的方式使用。
'\0'
是“空字符”。它是1个字节,值为0x00。
NULL
是“空指针”。在32位机器上,它可能是4个字节,其值为0x00000000。在64位机器上,它可能是8个字节,其值为0x0000000000000000。 (像int
这是由编译器的作者决定如何实现它,它是什么大小)
因此,虽然两个版本的代码返回相同的bool
答案,他们可以分配不同的金额的内存,并调用不同的比较函数以执行此比较。(如果关闭所有编译器优化,则保证是这种情况。如果打开编译器选项,智能编译器可能会将这两个版本优化为相同的代码。)
个人而言,我更喜欢使用相同的代码类型在我的比较。所以我总是写== '\0'
为char
类型,并且写指针类型为== NULL
。
'NULL'不是空指针。 'NULL'是一个* null指针常量*。 *空指针常量*和空指针*是两个非常非常非常不同的东西。 “NULL”的确切定义并不依赖于机器。例如,在任何C++实现中,将'NULL'定义为“0”始终保证正常工作,即使该实现使用地址0x12345678来表示实际的空指针。 – AnT 2014-10-07 15:52:59
谢谢。我通读了这篇文章,我不确定它是否完全相同。我的问题是在引用char类型。 – temetvince 2014-10-07 15:03:47