1

gcc4.8を使用しています。そして、スリープを使用してそのようなコードを書きました。

int main(int argc, char *argv[])
{
    /* I know it's worong to pass a floating number to sleep
     * this is only for testing. */
    sleep(0.001);               
    return 0;
}

「gcc -Wall ac -o a」でコンパイルしたところ、「関数 'sleep' の暗黙の宣言 [-Wimplicit-function-declaration]」という警告が表示されました。それから私はそれを実行しました、このプログラムは約 1 秒スリープします (スリープ ceils 0.001 から 1 のようです)。

次に、コードを次のように変更します。

#include <unistd.h> /* add header file */
int main(int argc, char *argv[])
{
    /* I know it's worong to pass a floating number to sleep
     * this is only for testing. */
    sleep(0.001);               
    return 0;
}

今回は0秒しか眠らず、睡眠階は0.001から0のようです。

これらの 2 つの睡眠は同一であるべきではありませんか?

4

2 に答える 2

4

最初の (間違った) ケースでは、実際の浮動小数点値が sleep に与えられます。これは、 のプロトタイプがsleep浮動小数点値 (double実際には a) を取ると想定されているためです。これのビット表現をとしてsleep解釈し、何秒も待機します。これがわずか1秒であることは幸運です。2 番目のケースでは、浮動小数点値が にキャストされ、0 に丸められます。doubleintint

于 2013-05-03T14:18:31.530 に答える