以下代码(从此处获取):
int* ptr = int();
在Visual C ++中进行编译,并对值进行初始化。
那怎么可能?我的意思是int()
产生一个类型的对象,int
我不能将分配int
给指针。
上面的代码如何不违法?
以下代码(从此处获取):
int* ptr = int();
在Visual C ++中进行编译,并对值进行初始化。
那怎么可能?我的意思是int()
产生一个类型的对象,int
我不能将分配int
给指针。
上面的代码如何不违法?
int()
产生值的构造值int
(我认为这是C ++ 03指定的值),默认值int
是0
。这等效于int *ptr = 0;
NULL
可能是非零值。我说过,它可以是任何零值整数常量(包括int()
)。
Answers:
int()
是值为0的常量表达式,因此它是产生空指针常量的有效方法。最终,这只是一种稍微不同的说法int *ptr = NULL;
nullptr
,您可以在C ++ 11中使用它代替0
或NULL
在新代码中使用。
0
可能表示空指针常量或数字0,而nullptr
显然是空指针常量。此外,正如Jamin所说,它还具有“额外的编译时检查”功能。在键入之前,请尝试思考。
因为int()
产量0
,这是可以互换的NULL
。NULL
本身被定义为0
,与C的NULL
这是(void *) 0
。
请注意,这将是一个错误:
int* ptr = int(5);
并且仍然可以使用:
int* ptr = int(0);
0
是一个特殊的常量值,因此可以将其视为指针值。产生0
诸如的常量表达式1 - 1
也可以与空指针常量一起使用。
(void *)0
。它只是一个定义为“值为0的整数常量表达式,或此类转换为void *的表达式”的实现。
NULL
为(void*)0
;的C编译器。总是0
(或者也许0L
)。(但是,当C90(void*)0
在C中成为合法代码时,我已经在使用C ++。)
#if !defined(__cplusplus) \n #define NULL ((void*)0) \n #else \n #define NULL (0)
ubuntu中gcc的当前版本是4.5,在我们的系统中是4.0。
0
是特殊文字”-仅因为它是一个常量表达式,并且具有特殊值0。(1-1)
同样特殊,它也是一个空指针常量,因此也是int()
。0
作为文字的事实足以成为常量表达式,但不是必需的条件。诸如之类的东西strlen("")
,尽管也具有特殊的值,但它0
不是常量表达式,因此也不是空指针常量。
0
,而不是0
字面量。
表达式的结果int()
为一个常量的默认初始化整数,该整数值为0。该值很特殊:它用于初始化一个指向NULL状态的指针。
int f() { return 0; }
,表达式f()
的值为0,但不能用于初始化指针。
好吧,int不是对象。
我相信这里发生的事情是你告诉int *指向由int()确定的某些内存地址
因此,如果int()创建0,则int *将指向内存地址0
int()
最肯定是一个对象。
int()
。定义int i;
毫无疑问i
是一个对象。
int
是类型而不是对象而成立。无论是int()
产生一个对象或只是一个右值不会影响任何人在其他地方也说。