语言规范中定义的C语言的(类型名)用法在哪里?

时间:2019-01-22 12:42:58

标签: c

似乎(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) man page包含以下文本:

  

发生错误时,将返回((time_t)-1),并且已正确设置errno。

我浏览了C11语言规范N1570。但是我找不到有关上述用法的描述。

1 个答案:

答案 0 :(得分:2)

  

似乎(type-name)返回该类型的默认值。

那什至是什么意思? C中的类型不存在默认值。您的两条printf行执行以下操作:

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

    此处-1的类型为int。您强制从inttime_t的转换,后者具有未指定的格式,而不是“能够表示时间的实数”。

    然后您对程序撒谎,说所传递的值是long int类型。您调用未定义的行为,任何事情都会发生。在您的特定情况下,它似乎具有原始值-1。它也可能会打印垃圾或导致程序崩溃。

    这与time()函数完全无关,该函数在代码的任何地方都没有。

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

    -1的类型为int。您告诉编译器将int转换为int。出于礼貌,编译器不会质疑您为什么要编写这种无意义的代码,而可能只是将其预处理回-1中。

    然后,您告诉printf,您要打印值为int的{​​{1}}作为-1。然后做到这一点。


  

我浏览了C11语言规范N1570。但是我找不到有关上述用法的说明

请参见C11 6.5.4 Cast运算符和C11 7.21.6.1 fprintf函数