在編寫一些面試測試題時,我正在通過各種來源的例子,並通過它們來測試他們的難度和正確性。我遇到了一個我認爲已經壞了的東西,但也有可能我錯過了一些東西:如果我是,我想知道,不僅僅是爲了我自己的知識,但是它也表明這可能是一個好的,棘手的問題。我希望你能幫助我重新獲得理智並重申我對自己的信任。 :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
我不認爲這個問題是可以回答的;只有編寫代碼的人知道它的意圖。他可能打算散列地址值,或散列元素本身。 –