考察如下 C 程序:
??=include
int main()??
你可能看着会觉得很奇怪, 然而这却是一段合法的 C 程序, 我在 vc2008 中尝试编译并成功.
实际上, 三联符序列就是以 ?? 开头的三个字符, 用来对某个其它字符进行指定替换, 替换规则如下表:
三联符
替换
??=
#
??/
\
??’
^
??(
[
??)
]
??!
|
??<
{
??>
}
??-
~
现在就可以解释很久以前某人遇到过的一个奇怪问题了:
//?? blah blah ??/
printf("Hello World!\n");
以上程序中没有任何输出. 这个问题曾被群讨论归结为 vc6 的 bug, vc6 的确有很多 bug, 不过很可惜, 这不是其中的一个.
解释:??/ 被替换成\ ,而反斜杠表示断行,所以最开始的//连printf行一起注释掉了。
1994 年 C 语言标准的一个修订增加了二联符序列, 现在已经被包含到 C99 中, 二联符序列的对应规则如下:
二联符
替换
<:>
[
:>
]
{
%>
}
%:
#
不过据我所知, 大部分编译器还不支持二联符序列, 包括我正在使用的 vc2008.
原文连接:http://hi.baidu.com/iceboy_/item/d1a0d44d72507feba4c066e1