Hasty Briefsbeta

双语

A bunch of stuff I used to not know about K&R C

7 hours ago
  • #pre-ANSI C
  • #C programming
  • #K&R C
  • 由于单遍编译器设计以及K&R C中缺乏函数原型作用域,C语言的语法是上下文相关的。
  • `void` 关键字和诸如 `const` 的类型限定符是ANSI的发明;ANSI之前的C使用 `int` 作为返回类型且字符串字面量是可变的。
  • ANSI之前的C缺少 `signed` 说明符,类型组合有限(例如没有 `unsigned char`),并使用 `long float` 作为 `double` 的同义词。
  • 整数提升规则存在分歧:'保留无符号'与'保留值'(已标准化),没有 `U` 后缀,且无符号常量在符合 `int` 类型范围时具有 `int` 类型。
  • 八进制常量允许数字8和9;缺少诸如 `\a` 的转义序列,且 `\"` 通过反斜杠丢弃实际上有效。
  • 预处理器缺少 `##`、`#`、`#elif`、`defined` 运算符以及预定义宏;行延续仅限于特定上下文。
  • 函数声明符缺少类型化的参数列表,阻止了可变参数函数的声明;不允许函数类型的参数。
  • 结构体/联合体受限:没有赋值、函数参数/返回,或对 `auto` 结构体/联合体的复合初始化器。
  • 复合赋值运算符被词法分析为两个标记(例如,`+ =`);原始的 `=+` 是单个标记但已过时。
  • 控制流到达 `main` 函数末尾在标准之前被隐含为成功,在C89中成为未定义行为,在C99中特殊处理为隐式返回0。