注:这只是觉得好玩,才发上来的,事实上并不实用,但或许看完能对C/C++的历史典故多一点了解呵.
先看一个程序:
??=include <stdio.h>
int main()
??<
printf("%s","hello,world.??/n");
return 0;
??>
编译运行,OK,输出为hello,world.
为什么能够这样写,这里涉及到一个字符集与字符编码的问题.
我们知道现在的很多计算机用的是ASCII编码,正常情况下,\0x41都是代表'A'.可是ISO/IEC 646规定的所谓的国际标准,
让各国可以将本国的一些字符安排到原来的ASCII中,代替{}[]等字符所占据的位置.即在这些国家的机器里,就没有了
我们程序中经常要用到的[] {} \等字符了.这里便存在一个问题,就是程序的显示.例如假定某国以+替换了{ ,那么在程序中的{输入变成了
+,程序的可读性极差。当然,这个程序仍然能正常编译运行,这和编译器的解释有关,记住编译器只认识\0x..
于是一个补救办法产生了,这就是由C标准委员会推出的“三联符序列”。
三联符序列用来表示那些缺少的字符。
??= 表示 # ??) 表示] ??( 表示[
??! 表示 | ??/ 表示\ ??- 表示~
??> 表示 } ??< 表示( ??' 表示^
这样可读性要好些了。不过以增加了源文件的字节长度为代价。
而一些C++的设计者们认为这样的方案还不够友好,于是C++中又引入一些“替换记号”。
<%替{ and替&& and_eq替&=
%>替} bitor替| or_eq替|=
<:替[ or替|| xor_eq替^=
:>替] xor替^ not替!
%:替# compl替~ not_eq替!=
%:%:替## bitand替&
对于以上的用诸如<%等两个字符替换原字符的,称之为“二联符”.
/*在VC6。0上测试C++的引入记号,未通过。你可以在GCC下测试一下。*/
参考: 《C/C++深层探索》