2014-10-07 105 views
1

以下两个条件在C++中是否相同?他们都可以接受吗?我正在使用Visual Studio 2013 Express,并使用NULL。我的程序运行良好,但在我的家庭作业上,它被关闭,因为我使用NULL而不是'\ 0'。在条件语句中使用NULL和' 0'是否相同?

if (charArray[0] == NULL) 
if (charArray[0] == '\0') 
+1

谢谢。我通读了这篇文章,我不确定它是否完全相同。我的问题是在引用char类型。 – temetvince 2014-10-07 15:03:47

回答

5

NULL是空的指针常量。 charArray[0]可能不是指针。因此,您不应该将其与NULL进行比较。

C++标准表示:

NULL是在本国际标准(4.10)实现定义的C++空指针常量。

允许定义包括但不限于00L,并且,在C++ 11,nullptr。如果NULL被定义为nullptr,你的程序甚至不会编译。

在现代C++中,如果你想要零,你应该使用像0或这样的文字,如果你想要空指针,你应该使用nullptr。不应该真的使用NULL

+0

谢谢。如果我要比较指针,那么我应该使用NULL吗?或者它是否仍然是不好的做法,因为NULL可以是多个定义中的任何一个? 编辑:没关系,你的编辑完美地回答了我的问题!谢谢。 – temetvince 2014-10-07 15:36:06

+0

@temetvince最大的问题是'NULL'通常在非指针状况下工作,以至于人们会陷入不良习惯。 – 2014-10-07 15:42:42

0

不知道你在用什么语言(它看起来像C/C++),很难说清楚。

在C/C++中,NULL通常在包含的头文件中使用#define语句定义。它通常被定义为0,但也许你的教师停靠你的标记,因为它理论上可以定义为其他东西?

此外,0和'\ 0'是不同的类型,即使它们具有相同的二进制表示形式,这也可能是进行区分的原因。

0

它将在语言的较旧标准版本(C++ 98和C++ 03)中工作,其中NULL的合法定义仅限于具有零值的整数常量表达式。但在非指针上下文中使用NULL只会使代码难以阅读。 NULL应仅保留为指针上下文。

对于如何定义NULL,C++ 11允许额外的可能性。 C++ 11中的NULL的一些法律定义甚至不会在整数上下文中进行编译。

换句话说,NULL绝不应该以您在代码示例中使用它的方式使用。

0

'\0'是“空字符”。它是1个字节,值为0x00。

NULL是“空指针”。在32位机器上,它可能是4个字节,其值为0x00000000。在64位机器上,它可能是8个字节,其值为0x0000000000000000。 (像int这是由编译器的作者决定如何实现它,它是什么大小)

因此,虽然两个版本的代码返回相同的bool答案,他们可以分配不同的金额的内存,并调用不同的比较函数以执行此比较。(如果关闭所有编译器优化,则保证是这种情况。如果打开编译器选项,智能编译器可能会将这两个版本优化为相同的代码。)

个人而言,我更喜欢使用相同的代码类型在我的比较。所以我总是写== '\0'char类型,并且写指针类型为== NULL

+1

'NULL'不是空指针。 'NULL'是一个* null指针常量*。 *空指针常量*和空指针*是两个非常非常非常不同的东西。 “NULL”的确切定义并不依赖于机器。例如,在任何C++实现中,将'NULL'定义为“0”始终保证正常工作,即使该实现使用地址0x12345678来表示实际的空指针。 – AnT 2014-10-07 15:52:59

相关问题