当我用C编写程序时,我经常需要自己打印换行符。我知道你可以通过至少两种方式做到这一点:printf("\n")
和putchar('\n')
,但我不确定哪种方式在风格和效率方面是最佳选择。是否有使用其中一种的最佳实践?这真的很重要吗?
答案 0 :(得分:20)
如果您使用现代编译器 [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
是一个现代编译器。答案 1 :(得分:9)
是否有使用其中一种的最佳做法?
让风格推动决策。
由于执行效率相同或几乎相同,因此请使用最能传达较大代码功能的样式。
如果该函数有很多printf()
,请留在printf("\n")
。
同样适用于putchar('\n')
和puts("")
答案 2 :(得分:5)
这并不重要。在功能选择或效率方面,我从来没有遇到过打印到控制台的情况,对某人来说无关紧要。
答案 3 :(得分:4)
printf
和putchar
都是stdio函数,因此它们都写入相同的FILE
句柄(而不是直接写入文件描述符)。
但是,printf
要重得多,因为第一个参数是需要扫描替换表达式和转义的格式字符串。
因此,printf("\n")
和putchar('\n')
都会做同样的事情,但后者会更快。
答案 4 :(得分:3)
printf要慢得多,因为格式字符串在运行时被解析。当然,平均的家庭作业程序或简单的Project Euler解决方案是如此之小,以至于浪费几个CPU周期并不重要。
答案 5 :(得分:3)
我会选择putchar
,因为需要解析printf
中的字符串。应该稍快一些 - 但可能不是很多。