Где использование (type-name) для языка C определено в спецификации языка? - PullRequest
0 голосов
/ 22 января 2019

Кажется, что (type-name) возвращает значение по умолчанию для типа.

Рассмотрим следующий код:

#include <time.h>
#include <stdio.h>

int main() {
  printf("value: %ld\n", ((time_t) -1));
  printf("value: %d\n", ((int) -1));
}

Используйте gcc code.c для его компиляции. Запуск ./.aout производит:

value: -1
value: -1

Я использую GCC 8.1.0 на Ubuntu 16.04.5 LTS.

И Страница справочника TIME (2) имеет следующий текст:

При ошибке возвращается ((time_t) -1) и значение errno устанавливается соответствующим образом.

Я просмотрел спецификацию языка C11 N1570 . Но я не могу найти описание вышеупомянутого использования.

1 Ответ

0 голосов
/ 22 января 2019

Кажется, что (type-name) возвращает значение по умолчанию для типа.

Что это вообще должно означать?Там нет никаких значений по умолчанию для типов в C. Ваши две строки printf делают это:

  • printf("value: %ld\n", ((time_t) -1));

    Здесь -1 имеет тип int.Вы заставляете преобразование из int в time_t, последний имеет неопределенный формат, кроме того, что он является «реальным типом, способным представлять времена».

    Тогда вы врете программе и говорите, что переданное значение имеет тип long int.Вы вызываете неопределенное поведение, все может случиться.В вашем конкретном случае кажется, что оно дает исходное значение -1.Он также может напечатать мусор или вызвать сбой программы.

    Это не имеет абсолютно никакого отношения к функции time(), которой нет нигде в коде.

  • printf("value: %d\n", ((int) -1));

    -1 имеет тип int.Вы говорите компилятору конвертировать из int в int.Компилятор, будучи вежливым, не задается вопросом, почему вы написали такой бессмысленный код, но, скорее всего, просто предварительно обработал его обратно в -1.

    Затем вы сказали printf, что хотите напечатать вашint со значением -1 как int.И тогда он делает это.


Я просмотрел спецификацию языка C11 N1570.Но я не могу найти описание вышеупомянутого использования

См. C11 6.5.4 Операторы приведения и C11 7.21.6.1 Функция fprintf .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...