关于C#:这些奇怪的问号是什么意思?

What is the meaning of these strange question marks?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
??=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;
??>

输出:

1
2
3
FF
FF
FF


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

过去,许多计算机及其键盘都是基于一个旧的符号表(称为iso 646),它不包含C语言中使用的所有符号,如\ { } [ ]。这使得一些国家的程序员甚至不可能写C,因为他们的国家键盘布局缺少必要的符号。C语言没有重新创建键盘和符号表,而是被更改了。

因此引入了三角图。今天,它们被认为是完全过时的特性,不建议使用它们。例如,如果你使用它们,GCC会给你一个警告。不过,为了向后兼容,它们仍然是C标准中的,所有C编译器都必须支持它们。

现有的三角图序列为(C11 5.2.1.1三角图序列):

1
2
3
4
5
6
7
8
9
??=  #
??(  [
??/  \
??)  ]
??'  ^
??<  {
??!  |
??>  }
??-  ~

左列是三角图序列,右列是它的含义。