2017-02-09 336 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呃,我指的是生成这些数字的方式。不是演员本身。现在重新阅读我的答案,听起来不像那样。谢谢。 –