考虑以下代码:
#include <unistd.h>
int main(void) {
sleep(.1);
return 0;
}
我使用gcc -Wall sleep.c -o sleep
进行编译,没有警告。
运行它给我
time ./sleep real 0m0,001s user 0m0,001s sys 0m0,000s
.1
神奇地变成了0
,但我的问题是为什么没有警告?
我在Lubuntu 18.04中使用了库存gcc 7.3.0
答案 0 :(得分:4)
这是有效的转换-将小数部分0.1
转换为unsigned int
时,小数部分将被丢弃。它本质上等效于sleep(0);
。因此,不需要编译器发出任何诊断信息。
但是,gcc
确实有一个选项-Wconversion
会产生:
gcc -Wall -Wextra -pedantic -Wconversion a.c
a.c: In function ‘main’:
a.c:8:11: warning: conversion from ‘double’ to ‘unsigned int’ changes value from ‘1.0000000000000001e-1’ to ‘0’ [-Wfloat-conversion]
sleep(0.1);
^~~
答案 1 :(得分:0)
C自动执行此操作。如果将小数(例如双精度或浮点型)放入int,short,long等中,则得到的是截断的数字。也就是说,所有小数点都掉了。 3.3变为3,5.7变为5,依此类推。