首页 > 解决方案 > C:为什么为 int 参数传递 float/double 文字不会引发警告?

问题描述

考虑这段代码:

#include <unistd.h>

int main(void) {
    sleep(.1);
    return 0;
}

我编译它时gcc -Wall sleep.c -o sleep没有任何警告。运行它给了我

时间./睡觉

真正的 0m0,001s
用户 0m0,001s
系统 0m0,000s

.1神奇地变成0了,但我的问题是为什么没有警告?我在 Lubuntu 18.04 中使用股票 gcc 7.3.0

标签: clinuxgcc-warning

解决方案


这是一个有效的转换 - 当您将小数部分转换0.1unsigned 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);
               ^~~

推荐阅读