C: Почему передача литерала типа float / double для аргумента int не вызывает предупреждений? - PullRequest
0 голосов
/ 20 ноября 2018

Рассмотрим этот код:

#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, но мой вопрос: почему нет предупреждений?Я использую стоковый GCC 7.3.0 в Lubuntu 18.04

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

C автоматически делает это.Если вы введете десятичное число, например double или float, в int, short, long и т. Д., То вы получите усеченное число.То есть все десятичные дроби выпали.3,3 становится 3, 5,7 становится 5 и т. Д.

0 голосов
/ 20 ноября 2018

Это допустимое преобразование - дробная часть отбрасывается при преобразовании 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);
               ^~~
...