6

我遇到了一些看起来很奇怪的代码。它甚至看起来不像 C,但令我惊讶的是,它可以在我的 C 编译器上编译和运行。这是对 C 语言的一些非标准扩展吗?如果是,原因是什么?

??=include <stdio.h>

int main()
??<
  const char arr[] = 
  ??<
    0xF0 ??! 0x0F,
    ??-0x00,
    0xAA ??' 0x55
  ??>;

  for(int i=0; i<sizeof(arr)/sizeof(*arr); i++)
  ??<
    printf("%X??/n", (unsigned char)arr??(i??));
  ??>

  return 0;
??>

输出:

FF
FF
FF
4

1 回答 1

14

该代码完全符合任何版本的 C 标准。该??机制称为三元组,并被引入 C 以允许打印某些符号的替代方式。看起来该程序是作为各种三元序列的演示而编写的。

过去,许多计算机及其键盘都基于一个名为ISO 646的旧符号表,其中不包含 C 语言中使用的所有符号,例如\ { } [ ]. 这使得一些国家的程序员甚至无法编写 C,因为他们的国家键盘布局缺乏必要的符号。改变了 C 语言,而不是重新制作键盘和符号表。

因此引入了三元组。今天,它们被认为是完全过时的功能,不建议使用它们。例如,如果你使用它们,GCC 会给你一个警告。尽管如此,它们仍保留在 C 标准中以实现向后兼容性,并且所有 C 编译器都必须支持它们。

现有的三字母序列是(C11 5.2.1.1 三字母序列):

??=  #
??(  [
??/  \
??)  ]
??'  ^
??<  {
??!  |
??>  }
??-  ~

左栏是三字序列,右栏是它的含义。

于 2014-05-23T09:29:50.043 回答