2017-02-09 268 views
3

我目前正在讀基於C初學者的書++,它有這個例子的時間(0)的的static_cast:爲什麼這段代碼

int main() 
{ 
    srand(static_cast<unsigned int>(time(0))); //seed random number generator 
    int randomNumber = rand(); //generate random number 
    int die = (randomNumber % 6) + 1; // get a number between 1 and 6 
    cout << "You rolled a " << die << endl; 
    return 0; 
} 

我只是想知道演員的目的。我試圖

cout << time(0); 

cout << static_cast<unsigned int>(time(0)); 

它產生相同的結果,所以我不知道爲什麼投中的代碼。

回答

5

返回的類型std::time其中std::time_t是實現定義的數字類型。

數值類型隱式轉換到對方,所以srand(time(0));可以保證被明確定義,但在一些實施std::time_t可能是一個類型,其所有值都不會被unsigned int表示的,所以一個有用的編譯器可能會產生一個大約警告縮小的轉換可能是偶然的。

顯式靜態轉換告訴編譯器轉換是有意的,所以不管產生什麼std::time_t定義,都不會產生警告。

4

srand()預計unsigned inttime()返回std::time_t這是一個實現定義的類型。它可能不是unsigned但已簽名。如果std::time_t被定義爲unsigned int,則static_cast用於抑制錯誤/警告的可能性。請注意,這實際上並不是很好的做法。

P.S如果您有一個支持C++ 11的編譯器,那麼請一起停止使用rand()/srand(),並開始使用新標頭<random>

+0

你想解釋爲什麼壓制警告(在這種情況下)不是好的做法嗎? –

+1

@MartinBonner呃,我指的是生成這些數字的方式。不是演員本身。現在重新閱讀我的答案,聽起來不像那樣。謝謝。 –