为什么在C和C++中@和$字符没有被使用?

11

在这两种语言中,基本的源字符集包括除了@$`之外的所有可打印ASCII字符。我可以理解为什么不使用重音符号,因为它并不总是被解释为单独的字符,并且它看起来非常类似于撇号。但是是否有特定的原因导致@和$没有任何用途呢,还是说语言设计者只是没想到如何使用它们呢?:)


2
@ 在 Objective-C 中使用,它是 C 语言的严格超集,如果 C 语言使用 @ 将会出错。至于 $,我不清楚。你认为它们应该被使用吗? - Daniel
13
在语言设计中,是否应该把使用每个字符作为一个目标? - Benjamin Lindley
2
历史上,vi编辑器是在C语言时代发现的。在vi编辑器中,实际上$符号内部通知了行尾的含义(尽管它没有被显式地使用)。然而,@可以有一些很好的用途;它应该已经存在于该语言中。 - iammilind
1
@Laurent:¥和€不是ASCII码。 - Thilo
5
如果他们的目标是为键盘上的每个标点符号找到一个含义,那么他们会创建Perl ;^) - Jeremy Friesner
显示剩余6条评论
5个回答

5

我无法想象它们会占用多少容量。也许可以使用@表示指针...

但是$和@是非常繁忙的符号,可能会分散注意力,如果你将它们与已经多样化的语法混合使用,只是因为它们存在,你最终可能会得到一种类似于perl正则表达式的语言。这意味着它根本无法阅读。:P


1
许多 Pascal 实现使用 "$" 作为十六进制前缀。远比笨重且丑陋的 0x 好得多。 - supercat
1
@supercat - 输入一个 $ 后面跟着八个数字一定很爽。 :P - Anne Quinn
通常使用两个或四个数字。 使用“0x”作为十六进制前缀,逗号分隔的字节每个占用五个字符,逗号分隔的单词每个占用七个字符。 即使其中有十六个字节或十二个单词,也会换行到80个字符的行。 使用“$”作为十六进制前缀,逗号分隔的字节无论是以十六进制还是十进制书写,都需要四个字符,16位字同样需要六个字符。 十六个逗号分隔的字节将适合于64个字符,而十个逗号分隔的单词将适合于70个字符。 顺便说一句,“0x”表示十六进制并不像“0”表示八进制那么可怕。 那只是邪恶的。 - supercat

3

@符号是个坏主意,因为它是删除字符。如果你在程序中输入时不小心按到@,那么你会把此前输入的整行都删掉。

#符号也差不多是个坏主意,因为它是擦除字符。如果你在程序中输入时不小心按到#,那么你会把最近输入的一个字符删掉。

当预处理器被添加到C语言中时,#可以在行首使用,但不能在其他位置使用。因此,也许ed被修改了,允许#作为行首的第一个字符输入,因为前面没有字符需要被擦除。

那么,为什么预处理器没有使用$代替#呢?我回答了你问题的一半,但又增加了另一半的答案。

过去报纸文章中没有@字符。在互联网普及之后,一些记者或编辑在报纸文章中放置了4个字符的字符串“(at)”,因为他们无法或不愿使用某些转义序列来将实际的@放入文章中。Unix中的kill字符@的定义是从新闻设备中复制过来的。

http://en.wikipedia.org/wiki/Seventh_Edition_Unix_terminal_interface


Pascal(比C稍早,如果我没记错的话)使用@作为地址运算符。;-) - Rudy Velthuis
Pascal并非与Unix同时设计,也没有从报纸设备中复制kill字符,最初也没有使用花括号或其他依赖于美国的字符。 - Windows programmer
嗯,可能是真的。显然对于Wirth来说,@并不是一个坏主意,也不是一个"致命字符"。 - Rudy Velthuis
是的,我同意,对于Wirth而言,@并不是一个坏主意,因为他没有与Unix一起开发Pascal,而Unix在输入时从报纸设备中复制了@作为终止字符,而不是在编译器解析时。如果C没有与Unix一起开发,那么我打赌它会使用@。如果Unix最初使用backspace和control-X的方式就像现在经常做的那样,那么在与Unix同时开发的编程语言中,@不会是一个坏主意。 - Windows programmer

2
你应该首先问的问题是,“为什么在C/C++函数和变量名称中只允许特定的字符”?
即使我也不够老,无法回答这个问题……但我敢打赌,许多特殊字符(尤其是$)在原始Unix中的外部符号中都是非法的。也就是说,汇编器和链接器会对它们感到困扰。
因此,非字母数字字符的唯一用途就是在操作符中,例如+或->。最初的设计者可能已经拥有了他们所需的所有操作符,因此没有理由使用$或@或其他字符。(反引号markdown怎么做呢?)
随着C++和名称重整的出现,标识符名称上的大多数限制可能被解除。但是,即使是C++委员会也不会毫无理由地违背传统。
总之,这只是我的猜测。我知道,要明确回答你的问题,你需要虚拟地将自己传送到1973年...

1
也许,标准委员会没有包含这些字符,因为有很多字符可供选择,他们只是觉得这些字符很奇怪。除非标准委员会的某个人实际回答了这个问题,否则我们可能永远不会知道背后的原理。为什么不

至少在MSVC和GCC中,$作为有效标识符得到支持。

以下代码在两者中都可以编译:

struct $Y1$ 
{
   void $Test$() {}
};

int main() 
{
   $Y1$ $x$;
   $x$.$Test$();
   return 0;
}

这些决定在C语言接近任何标准委员会之前很久就已经发生了。 - hmakholm left over Monica

1

我没有看到它们被使用的任何特定原因。

我的意思是,也许像Perl中一样,$@可以用来表示标量和数组,但是为每个变量名称添加一个字符的好处很少。

此外,在C中,数组实际上只是指针的语法糖,因此它们可以在某种标量上下文中使用。

也许它们可以像其他有效字符一样允许在变量名中使用。

或者也许原因只是因为他们没有考虑过,因为真的没有理由把它们放进去。

去问K&R吧 :)


在Scala、Java和JavaScript中,"$"是标识符的有效部分,它不一定是用于sigil。(在Java或Scala中包含"$"的标识符可能是自动生成的类名。) - user166390
2
数组不仅仅是指针的语法糖。 - fredoverflow
@Fred:你链接到了一个C++的常见问题解答。你的说法对于C语言也适用吗? - Robert Harvey
@Robert:在两种语言中,数组都是实际的存储空间,即一个由10个元素组成的数组大小为10*sizeof(element),而指针只是包含一个地址的变量。将一个数组分配给相同基类型的指针是一种方便的方法。但是,数组不仅仅是指针的语法糖。 - Rudy Velthuis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接