在编写一些面试测试题时,我正在通过各种来源的例子,并通过它们来测试他们的难度和正确性。我遇到了一个我认为已经坏了的东西,但也有可能我错过了一些东西:如果我是,我想知道,不仅仅是为了我自己的知识,但是它也表明这可能是一个好的,棘手的问题。我希望你能帮助我重新获得理智并重申我对自己的信任。 :D据我所知,这些答案都不正确。我错过了什么?
什么是在占位符“???”上投P的正确方法是什么?在下面的代码中?
#include <iostream> using namespace std; uint16_t hash(void *p) { uint32_t val = ???; return (uint16_t)(val^(val >> 16)); } int main(int argc, char *argv[]) { uint32_t a[20]; for(uint32_t i = 0; i < 20; ++i) { a[i] = i; cout << hash(a + i) << endl; } }
选择一个:
static_cast<uint32_t>(p)
dynamic_cast<uint32_t>(p)
reinterpret_cast<uint32_t>(p)
const_cast<uint32_t>(p)
暂时忽略拨打hash
的电话必须是::hash
,以保证与标准库(例如,这行不能在GCC 5.3.0,C++ 14模式下编译),我对这个问题有疑问。首先,目前尚不清楚程序应该做什么。散列数组值,或散列元素位置?因为此时函数正在接收指向元素的指针,但所有可用的答案都假设这些指针本身将被转换为uint32_t
并用作散列值。如果是这种情况,那么即使您使用reinterpret_cast
,然后there is a bug because sizeof(void*)
may not be sizeof(uint32_t)
; val
in that function should be intptr_t
instead。对于数组元素类型,使用uint32_t
只会使事情进一步混淆,如果这实际上是共同发生的事情。
或者该函数应该散列该值并且正确答案不在列表中:*static_cast<uint32_t*>(p)
。
“正确”的答案显然是reinterpret_cast<uint32_t>(p)
,这让我觉得程序的意图是散列数组元素地址。
我在想像这些问题吗?
问题是否清晰并且解决方案是提供的四种选择之一?
不能真正发布这个答案,但对我来说,它看起来好像你的分析是正确的,面试问题是错误的,除非我在这里失去了一些至关重要的东西。 – Cubic
你为什么要散列任意指针?这有什么用途?我认为你假设它采用'* x_cast(p)'的形式是正确的。 –
tadman
我不认为这个问题是可以回答的;只有编写代码的人知道它的意图。他可能打算散列地址值,或散列元素本身。 –