替用运算符

看这样一段代码,你能认出是什么语言吗?

%:include <stdio.h>

char a<:4:>={'A','B','C','D'};

int main()
<%
	printf("%c\n",a<:1:>);
	return 0;
%>

emmm..看stdio.h好像是C语言吧,可%: <%%> <::>都是什么鬼?
如果你将这段代码保存为.c后缀的文件编译运行一下,你会发现,没有一点点的编译错误!

这段代码等价于

#include <stdio.h>

char a[4]={'A','B','C','D'};

int main()
{
	printf("%c\n",a[1]);
	return 0;
}

这里的奥秘其实来源于一个叫做ISO646的标准,我在国际标准组织官网找到了这份文件

看了一下,下载这个标准大概一个星期的伙食费就没了

果断百度盗版。
我们可以看到,这里给出了一张名为unique graphic character allocations(唯一图形字符分配)的表,受限于篇幅,我们省去字母部分,只看符号部分。

注意一下,这里边是没有包含#[]``{}这几个写C语言程序时常用的字符的。

标准8.2给出了IRV(国际参考版本)

翻译一下开头的第一句话
this version is available for use when there is no requirement to use a national or an application-oriented version.
当不需要使用国家或面向应用程序的版本时,可以使用此版本。

小结一下官方的意思,只要你使用唯一图形字符分配中的字符,在各个国家和系统中都是通用的,但是如果你使用IRV中的字符,在某些国家可能是不通用的。

C是在美国使用标准美式键盘的系统上发展而来的,但在世界各地,并不是所有的键盘都有与美式键盘相同的的符合。

例如下面这个德文键盘

你看,你能在上面找到井号吗?找不到。

那么德国人写C语言如果要声明一个头文件,怎么办呢?

为了解决这样的问题,C99标准为逻辑运算符增加了可供选择的拼写法。

这样,即使德国人键盘上没有#这些符号,也可以通过%:等符号进行替代。

posted @ 2019-03-17 21:40  Velscode  阅读(116)  评论(0编辑  收藏