混乱你的代码

注:这只是觉得好玩,才发上来的,事实上并不实用,但或许看完能对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++深层探索》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值