当我用 C 编写程序时,我经常需要自己打印换行符。我知道您至少可以通过两种方式做到这一点:
printf("\n")
和putchar('\n')
,但我不确定哪种方式在风格和可能的效率方面是最佳选择。是否有使用其中一种而不是另一种的最佳实践?这真的很重要吗?
如果您使用的是现代编译器[1],那么选择哪一个都没有什么区别。以下面的 C 代码为例。
#include <stdlib.h>
#include <stdio.h>
void foo(void) {
putchar('\n');
}
void bar(void) {
printf("\n");
}
当使用
gcc -O1
(启用优化)进行编译时,我们在 foo
和 bar
中获得以下(相同)机器代码:
movl $10, %edi
popq %rbp
jmp _putchar ## TAILCALL
foo
和bar
最终都打电话给putchar('\n')
。换句话说,现代 C 编译器足够智能,可以非常有效地优化 printf
调用。只需使用您认为更清晰易读的那个即可。
cl
是一个现代编译器。是否有使用其中一种而不是另一种的最佳实践?
让风格驱动决策。
由于执行效率相同或几乎相同,因此请使用最能传达较大代码功能的风格。
如果函数有很多
printf()
,请保留 printf("\n")
。
同样适用于
putchar('\n')
和 puts("")
这并不重要。我从来没有遇到过打印到控制台对某人来说在功能选择或效率方面很重要的情况。
printf
和 putchar
都是 stdio 函数,因此它们都写入相同的 FILE
句柄(而不是直接写入文件描述符)。
但是,
printf
要重得多,因为第一个参数是一个格式字符串,需要扫描替换表达式和转义符。
所以,
printf("\n")
和putchar('\n')
都会做同样的事情,但后者会更快。
printf 慢得多,因为格式字符串是在运行时解析的。当然,一般的家庭作业程序或简单的 Project Euler 解决方案都很小,浪费几个 CPU 周期也没关系。
我会选择
putchar
,因为 printf
中的字符串需要解析。应该稍微快一点——但可能不会太多。