为什么选择百分号(%)作为printf系列功能的格式说明符?


27

每个人都知道,至少在C语言中,您使用printf函数族来打印格式化的字符串。这些函数使用百分号%)表示格式说明符的开头。例如,%d表示打印一个int和,%u表示打印一个unsigned int。如果您不熟悉printf函数和格式占位符的工作方式,或者只是需要复习,则Wikipedia文章是一个不错的起点。

我的问题是,这是最初还是将来会被选作格式说明符的原因是否特别引人注目?

显然,该决定是在很久以前做出的(很可能是C语言的前身),从那时起,它或多或少成为“标准”的(不仅在C语言中,而且在许多其他语言中,已经在不同程度上采用了它的语法),所以现在改变为时已晚。但是我仍然很好奇,是否有人对为什么首先要做出这种选择有任何见解,以及如果人们正在设计一种具有类似功能的新语言,是否仍然有意义。

例如,对于C#(和其他.NET语言家族),Microsoft在字符串格式化功能的操作方面做出了稍有不同的决定。尽管可以在此处强制执行某种程度的类型安全(与printfC中的实现不同),因此没有必要包含相应参数类型的指示,但他们决定使用零索引的花括号对({})作为格式说明符,例如:

string output = String.Format("In {0}, the temperature is {1} degrees Celsius.",
                              "Texas", 37);
Console.WriteLine(output);

// Output:
//     In Texas, the temperature is 37 degrees Celsius.

String.Format方法的文档包含更多信息,就像这篇文章有关复合格式的一般说明一样,但是确切的细节并不重要。关键是他们放弃了%用于指示格式说明符开始的长期实践。C语言本来可以轻松使用{d}{u},但事实并非如此。任何人都对以下原因有任何想法:为什么要回想起这个决定,以及是否应该遵循新的实现方式?

显然,没有可以不必逃避的字符可以选择,以便可以将其包含在字符串本身中,但是仅使用两个就可以很好地解决该问题。还有哪些其他考虑因素?


5
逸出的问题不是通过使用两个字符来解决。这只是意味着您还有一个角色要逃脱。
JJJ

2
我好奇。当然,可以使用{u}代替,%u但是有什么显着的优势吗?这似乎是一个很大的选择。
CB Bailey 2012年

12
@JarrodRoberson,所以您是说他们故意选择了{}语法,以便学习C#的人不会开始学习其他内容?我发现很难相信这是他们设计决策中的重要部分,即使有的话。您能以某种方式备份您的陈述吗?
stijn 2012年

6
有趣的是,Python放弃了(一种非常高级的格式)%格式,转而使用类似于.NET {}格式的格式,因为后者提供了更大的灵活性。
康拉德·鲁道夫2012年

3
为什么天空是蓝色的,为什么“蓝色”一词称为蓝色?他们不得不挑选一些东西。

Answers:


12

如@Secure所述,C的printf功能是受BCPL的writef功能启发的。并且,如果您查看BCPL的维基百科页面,则有一个示例显示BCPL writef还用于%引入格式说明符。

因此我们可以推断出C使用了 %是因为BCPL这样做了,还是出于与BCPL相同的原因而使用了。我的直觉是,这只是%最不常用的ASCII字符之一……作者认为。他们也可能没有花很多时间来衡量各种选择。当时,BCPL和C都是晦涩的语言,因此作者最有可能要处理更重要的事情。

但是,作品中有一个小扳手。尽管C受到BCPL的启发,但尚不清楚C是借用BCPL I / O库还是以其他方式使用。我朦胧地记得BCPL的I / O库在将中缀字节索引运算符添加到该语言的过程中经历了一个演变过程。(实际上,我想我知道谁会知道这一点。)


3
“实际上,我想我知道谁会知道的”……并且?...和?..不要只留下我们的悬崖衣架...
Mawg

2
@Mawg-Brian Knight可能会。伊恩·威尔逊(Ian Wilson)可能会。马丁·理查兹(Martin Richards)肯定会的。HTH。
斯蒂芬·C

6

维基百科条目包含的历史信息不多,并非特定于 printf,而是通常用于转义字符。

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

在Bob Bemer的IBM技术出版物中可以找到对“转义符”的早期引用。显然,是他在研究ASCII字符集时发明了这种机制。

我的猜测是:反斜杠已用于字符串文字,格式字符串需要另一个字符。他们很可能选择了假定的正常使用和出现频率最少的角色。

顺便说一句,另一篇相关文章与我以前听说过的一个术语相关联:

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

的文章提供printf了更多信息摘要,但没有说明原因。

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

C的可变参数printf起源于BCPL的writef函数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.