RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 989261
Accepted
eanmos
eanmos
Asked:2020-06-04 23:54:16 +0000 UTC2020-06-04 23:54:16 +0000 UTC 2020-06-04 23:54:16 +0000 UTC

为什么在 printf 系列函数中为格式说明符选择百分号 (%)?

  • 772

每个人都知道,至少在 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翻译这个问题。

c
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    eanmos
    2020-06-04T23:54:16Z2020-06-04T23:54:16Z

    正如@Secure 正确指出的那样,在设计函数时,printfC 语言的创建者受到writef了 BCPL 语言函数的启发。如果您查看BCPL Wikipedia 页面,您可以找到一个示例,该示例显示该函数writef也用于%标记格式说明符的开始。

    由此我们可以得出结论,C 使用%了相同的符号,因为 BCPL 使用了相同的符号。在我看来,做出这个选择仅仅是因为它%是最不常用的 ASCII 字符之一……至少,作者是这么认为的。似乎他们很久没有权衡所有的利弊了。同时C语言的设计和BCPL的设计都比较模糊,所以作者的问题比较严重。

    然而,这里出现了一个意想不到的问题。虽然 C 受到 BCPL 的启发,但尚不清楚 C 是否借用了 BCPL 的 I/O 库,反之亦然。我隐约记得 BCPL I/O 库是在将中缀字节索引运算符添加到语言中时演变而来的。(我想我知道谁能给出这个问题的确切答案。)

    斯蒂芬 C的回应的翻译。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5