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标准的任何版本。
过去,许多计算机及其键盘都是基于一个旧的符号表(称为iso 646),它不包含C语言中使用的所有符号,如
因此引入了三角图。今天,它们被认为是完全过时的特性,不建议使用它们。例如,如果你使用它们,GCC会给你一个警告。不过,为了向后兼容,它们仍然是C标准中的,所有C编译器都必须支持它们。
现有的三角图序列为(C11 5.2.1.1三角图序列):
1 2 3 4 5 6 7 8 9 | ??= # ??( [ ??/ \ ??) ] ??' ^ ??< { ??! | ??> } ??- ~ |
左列是三角图序列,右列是它的含义。