为什么static_cast on time(0)在这段代码上

时间:2017-02-09 13:46:57

标签: c++

我目前正在阅读一本关于C ++的初学者书,它有这个例子:

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));

它会产生相同的结果,因此我不确定为什么代码中的强制转换。

2 个答案:

答案 0 :(得分:5)

std::time返回的类型std::time_t是实现定义的数字类型。

数字类型可以隐式地相互转换,因此可以保证srand(time(0));定义良好,但在某些实现中,std::time_t可能是unsigned int无法表示所有值的类型因此,一个有用的编译器可能会产生一个关于缩小转换的警告,这可能是偶然的。

显式静态强制转换告诉编译器转换是故意的,因此无论std::time_t如何定义,都不会产生警告。

答案 1 :(得分:4)

srand()期望unsigned inttime()返回std::time_t,这是一种实现定义类型。它可能不是unsigned而是签名。如果static_cast被定义为std::time_t,则unsigned int可以抑制错误/警告的可能性。请注意,这实际上并不是很好的做法。

P.S如果你有一个支持C ++ 11的编译器,那么就一起停止使用rand()/srand()并开始使用新标题<random>