【问题标题】:Should I use printf("\n") or putchar('\n') to print a newline in C? [closed]我应该使用 printf("\n") 还是 putchar('\n') 在 C 中打印换行符? [关闭]
【发布时间】:2015-12-11 19:50:07
【问题描述】:

当我用 C 编写程序时,我经常需要自己打印一个换行符。我知道您至少可以通过两种方式做到这一点:printf("\n")putchar('\n'),但我不确定哪种方式在风格和效率方面是最佳选择。有没有使用其中一种的最佳实践?真的很重要吗?

【问题讨论】:

标签: c


【解决方案1】:

如果您使用的是现代编译器[1],您选择哪一个没有区别。以下面的 C 代码为例。

#include <stdlib.h>
#include <stdio.h>

void foo(void) {
    putchar('\n');
}

void bar(void) {
    printf("\n");
}

当使用gcc -O1(启用优化)编译时,我们在foobar 中都得到以下(相同的)机器代码:

movl    $10, %edi
popq    %rbp
jmp _putchar                ## TAILCALL

foobar 最终都会调用 putchar('\n')。换句话说,现代 C 编译器足够聪明,可以非常有效地优化 printf 调用。只需使用您认为更清晰易读的任何一个即可。


  1. 我不认为 MS 的 cl 是现代编译器。

【讨论】:

  • @ikegami - 我也试过 clang。我也可以尝试icc — 但如果商业编译器的优化比 gcc 更差,我会非常感到惊讶。在相关说明中,我还观察到 gcc 会将只有一个参数的 printf (只是一个没有格式说明符的格式字符串)更改为对 puts 的调用(假设它以换行符结尾)。
  • @ikegami:微软的cl 不是“现代编译器”。它的设计停留在 80 年代,对 C 语言的支持也是如此。
  • @ikegami:Windows 中有编译 C 程序的替代方案,甚至是那些调用 Windows API 的程序。 gcc 已为此移植。 cl 缺乏 C99 支持和 Microsoft C 运行时库。如果 OP 关心 C 语言,他可能应该完全切换到更现代的平台。
  • @ikegami:“现代编译器”的含义与“当今使用的编译器”非常不同。在判断一个编译器是“现代的”。
  • @ikegami - 请不要编辑我的答案以反映您的个人意见。
【解决方案2】:

是否有任何最佳做法可以使用其中一种方法?

让风格驱动决策。

由于执行效率相同或几乎相同,请使用最能传达较大代码功能的样式。

如果函数有很多 printf(),请使用 printf("\n")

putchar('\n')puts("") 也是如此

【讨论】:

    【解决方案3】:

    printfputchar 都是 stdio 函数,因此它们都写入同一个 FILE 句柄(而不是直接写入文件描述符)。

    但是,printf 要重得多,因为第一个参数是需要扫描替换表达式和转义的格式字符串。

    所以,printf("\n")putchar('\n') 都会做同样的事情,但后者会更快。

    【讨论】:

      【解决方案4】:

      这并不重要。在功能选择或效率方面,我从来没有遇到过打印到控制台对某人来说很重要的案例。

      【讨论】:

      • 打印到控制台大大减慢了执行程序相对于不打印的速度。差异是巨大的。尝试一个简单的测试:编写一个计数为一百万且不执行任何其他操作的 for 循环,然后在循环体中添加一个 print 语句。
      • 当然会变慢。关键是 pritnf 和 putchar 之间的区别甚至不值得麻烦。如果打印到控制台是您的瓶颈,那么您做错了。
      • 如果打印到控制台是程序的目的,那么您并没有做错什么。
      • 如果打印到控制台是目的 - 你可能在做一些不值得优化的事情。
      • 这些函数不一定打印到控制台。输出可能会被重定向到一个文件,如果产生大量输出,效率可能是一个问题。在这种情况下,putchar_unlocked('\n'); 会更高效,但几乎不是更好的选择。
      【解决方案5】:

      printf 慢得多,因为格式字符串是在运行时解析的。当然,普通的家庭作业程序或简单的 Project Euler 解决方案是如此之小,以至于浪费几个 CPU 周期无论如何都无所谓。

      【讨论】:

      • 许多 C 编译器在 compile 时解析常量格式字符串并创建优化代码。
      • 是的,但是如果编译器不优化这个琐碎的代码,那么 OP 的优化工作最好花在寻找更好的编译器上,而不是 printf("\n")putchar('\n')
      【解决方案6】:

      我会选择putchar,因为printf 中的字符串需要被解析。应该稍微快一点 - 但可能不是很多。

      【讨论】:

        猜你喜欢
        • 2017-01-31
        • 2015-02-26
        • 2017-07-18
        • 2020-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 2018-12-19
        相关资源
        最近更新 更多