每个人都知道,至少在 C 中,printf. 这些函数使用百分号(%)来指示格式说明符的开始。例如,表示“打印”,表示“打印”。如果您不熟悉函数和格式说明符的工作原理,请从这篇 Wikipedia 文章开始。%dint%uunsigned intprintf
我的问题是,最初选择百分号来标记格式说明符的开头是否有充分的理由?我们应该继续坚持这个“规则”吗?
很明显,这个决定是很久以前做出的(很可能甚至是 C 语言的前身),从那时起,人们可能会说,它已经成为一种“标准”(不仅在 C 语言中,而且在许多其他语言中)已经在某种程度上继承了它的语法的语言),所以现在改变任何东西都为时已晚。但我仍然想知道为什么首先做出这个决定,以及我们将来是否应该坚持下去。
例如,在 C#(以及 .NET 家族中的其他语言)中,微软的开发人员采取了稍微不同的方法来格式化字符串。他们选择在参数索引中使用花引号:
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有更多信息,关于一般复合格式的文章也有,但现在细节并不是特别重要。开发人员放弃使用%格式说明符来指示开始是很重要的。当然,由于类型安全,我们不需要提供任何关于相应参数类型的信息,这与printfC 不同,但在 C 中可以只使用{d}and {u}。有谁知道为什么做出不同的决定?我们应该继续遵循这个“传统”吗?
显然,没有一个转义字符不能单独使用,但是这个问题已经通过使用两个字符作为转义序列来解决。还有其他考虑吗?
从 SoftwareEngineering翻译这个问题。
正如@Secure 正确指出的那样,在设计函数时,
printfC 语言的创建者受到writef了 BCPL 语言函数的启发。如果您查看BCPL Wikipedia 页面,您可以找到一个示例,该示例显示该函数writef也用于%标记格式说明符的开始。由此我们可以得出结论,C 使用
%了相同的符号,因为 BCPL 使用了相同的符号。在我看来,做出这个选择仅仅是因为它%是最不常用的 ASCII 字符之一……至少,作者是这么认为的。似乎他们很久没有权衡所有的利弊了。同时C语言的设计和BCPL的设计都比较模糊,所以作者的问题比较严重。然而,这里出现了一个意想不到的问题。虽然 C 受到 BCPL 的启发,但尚不清楚 C 是否借用了 BCPL 的 I/O 库,反之亦然。我隐约记得 BCPL I/O 库是在将中缀字节索引运算符添加到语言中时演变而来的。(我想我知道谁能给出这个问题的确切答案。)
斯蒂芬 C的回应的翻译。