考虑这段代码:
#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.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);
^~~
关于C:为什么为 int 参数传递 float/double 文字不会引发警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53397476/