C:为什么为 int 参数传递 float/double 文字不会引发警告?
C: Why passing a float/double literal for an int argument does not raise warnings?
考虑这段代码:
#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、short、long 等,你得到的是截断后的数字。也就是说,所有小数点都被丢弃了。
3.3变成3,5.7变成5,依此类推
考虑这段代码:
#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
这是一个有效的转换 - 当您将其 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、short、long 等,你得到的是截断后的数字。也就是说,所有小数点都被丢弃了。 3.3变成3,5.7变成5,依此类推