阅读这篇问答时,我认为即使
在标准输入中输入0后,我的GCC会显示消息“p is nullptr”。根据链接,它不应该被评估为nullptr,但结果与我的预期不同。
这段代码是未定义行为还是未指定的结果?为什么它会被评估为nullptr?
x
是0
,p
也不应该是nullptr
。我的理解是否正确?int main()
{
int x = 0;
std::cin >> x; // Enter `0`
void *p = (void *)x; // or: void *p = reinterpret_cast<void*>(x);
if (!p)
std::cout << "p is nullptr" << std::endl;
}
在标准输入中输入0后,我的GCC会显示消息“p is nullptr”。根据链接,它不应该被评估为nullptr,但结果与我的预期不同。
这段代码是未定义行为还是未指定的结果?为什么它会被评估为nullptr?
int
强制转换为void *
指针(实际上可能只是一个更宽的int),但其值仍为0。你期望p
有什么值? - lc.if
语句实际上是在测试p == 0
,这当然是成立的。而0是否等于nullptr则是一个更有趣的问题(VC++2012表示它们相等,但这是否有意义就不得而知了)。 - dlfnullptr
?你是在谈论C++/CLI吗?NULL
就像零一样,有些C++编程人员甚至避免使用NULL
,因为它太不确定了(相反,他们会测试0或0L)。 - user6452800 == nullptr
。问题仅在于将int
类型的0
强制转换为指针后是否也相等。在 OP 的代码中似乎是这样的,但有些例子(尽管我现在找不到链接)表明这并非总是正确的(即空指针由非零位模式表示)。 - Konrad Rudolph