2017-02-09 3 views
3

に私は現在、C++の初心者の本を読んだし、それはこの例があります:なぜ時間にはstatic_cast(0)このコード

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がdefindであるかどうかに関係なく、警告は生成されません。

4

srand()unsigned inttime()は、実装定義型であるstd::time_tを返します。 unsignedではなく、署名されている可能性があります。 static_castは、std::time_tが別のものとしてunsigned intと定義されている場合、エラー/警告の可能性を抑制するために存在します。これは実際には良いことではないことに注意してください。

P.S C++ 11をサポートするコンパイラをお持ちの場合は、rand()/srand()の使用をすべて停止し、新しいヘッダ<random>の使用を開始してください。

+0

警告(この場合)を抑制することが効果的ではない理由を説明しますか? –

+1

@MartinBonnerおっと、私はそれらの数字を生成する方法を指していました。キャスト自体ではありません。私の答えをもう一度読んでみると、そんなことはありません。ありがとう。 –

関連する問題