代码之家  ›  专栏  ›  技术社区  ›  Jingguo Yao

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

c
  •  -1
  • Jingguo Yao  · 技术社区  · 7 年前

    似乎 (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 回复  |  直到 7 年前
        1
  •  2
  •   Lundin    7 年前

    似乎(类型名)返回类型的默认值。

    这到底是什么意思?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 5.5.4 铸造算子 和C17.21.6.1 fprintf函数 .