我应该使用printf("\n")还是putchar('\n')在C中打印换行符?

Cou*_*son 13 c

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

Dao*_*Wen 22

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

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

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

void bar(void) {
    printf("\n");
}
Run Code Online (Sandbox Code Playgroud)

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

movl    $10, %edi
popq    %rbp
jmp _putchar                ## TAILCALL
Run Code Online (Sandbox Code Playgroud)

双方foobar最终调用putchar('\n').换句话说,现代C编译器非常智能,可以printf非常有效地优化调用.只需使用您认为更清晰可读的任何一个.


  1. 我不认为MS cl是一个现代编译器.

  • @ikegami:Windows中有其他方法可以编译C程序,甚至是那些调用Windows API的程序.`gcc`已被移植.`cl`也缺少C99支持和Microsoft C运行时库.我关心C语言的OP,他可能应该完全转向更现代的平台. (2认同)
  • @ikegami:“现代编译器”的含义与“当今使用的编译器”截然不同。我会包括诸如支持当前版本的语言、使用合理的中间表示来应用转换/优化而不是“高级汇编器”模型、等效构造的规范化、对重要优化类别的支持等特征。编译器是“现代的”。 (2认同)

chu*_*ica 10

是否有使用其中一种的最佳实践?

让风格推动决策.

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

如果功能有很多printf(),请继续使用printf("\n").

同样的putchar('\n')puts("")


ike*_*ami 6

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

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

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


Dav*_*aim 5

这并不重要.我从来没有遇到过打印到控制台的案例,无论是功能选择还是效率,对某人都很重要.

  • 如果打印到控制台是目的 - 你可能正在做一些不值得优化的事情. (2认同)
  • 这些功能不一定*打印*到控制台.输出可以被重定向到文件,并且如果产生大量输出,则效率可能是一个问题.在这种情况下,`putchar_unlocked('\n');`会更有效但不是更好的选择. (2认同)