我遇到了一些奇怪的代码.它甚至看起来都不像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;
??>
Run Code Online (Sandbox Code Playgroud)
输出:
FF
FF
FF
Run Code Online (Sandbox Code Playgroud)
Lun*_*din 11
该代码完全符合C标准的任何版本.该??
机制称为三字形,并被引入C以允许另一种打印某些符号的方式.看起来该程序是作为各种三字符序列的演示而编写的.
在这些日子里,许多计算机及其键盘都基于一个名为ISO 646的旧符号表,它不包含C语言中使用的所有符号,例如\ { } [ ]
.这使得来自某些国家的程序员甚至无法编写C语言,因为他们的国家键盘布局缺乏必要的符号.C语言没有改变键盘和符号表,而是改变了.
因此引入了三字母.今天它们被认为是一个完全过时的功能,不建议使用它们.例如,如果你使用它们,GCC会给你一个警告.尽管如此,它们仍然保持C标准以实现向后兼容性,并且所有C编译器都必须支持它们.
现有的三字符序列是(C11 5.2.1.1 Trigraph序列):
??= #
??( [
??/ \
??) ]
??' ^
??< {
??! |
??> }
??- ~
Run Code Online (Sandbox Code Playgroud)
左列是三字符序列,右列是其含义.
归档时间: |
|
查看次数: |
542 次 |
最近记录: |