printf()和cout在c++中的区别是什么?
当前回答
TL;DR:在相信在线随机评论之前,一定要自己做研究,考虑生成的机器代码的大小、性能、可读性和编码时间,包括这一条。
我不是专家。我碰巧听到两个同事在讨论如何避免在嵌入式系统中使用c++,因为会导致性能问题。有趣的是,我基于一个真实的项目任务做了一个基准测试。
在该任务中,我们必须向RAM写入一些配置。喜欢的东西:
咖啡=热 糖=没有 牛奶=乳房 mac = AA: BB: CC:弟弟:EE: FF
这是我的基准测试程序(是的,我知道OP询问printf(),而不是fprintf()。试着捕捉本质,顺便说一下,OP的链接指向fprintf()。)
C程序:
char coffee[10], sugar[10], milk[10];
unsigned char mac[6];
/* Initialize those things here. */
FILE * f = fopen("a.txt", "wt");
fprintf(f, "coffee=%s\nsugar=%s\nmilk=%s\nmac=%02X:%02X:%02X:%02X:%02X:%02X\n", coffee, sugar, milk, mac[0], mac[1],mac[2],mac[3],mac[4],mac[5]);
fclose(f);
c++程序:
//Everything else is identical except:
std::ofstream f("a.txt", std::ios::out);
f << "coffee=" << coffee << "\n";
f << "sugar=" << sugar << "\n";
f << "milk=" << milk << "\n";
f << "mac=" << (int)mac[0] << ":"
<< (int)mac[1] << ":"
<< (int)mac[2] << ":"
<< (int)mac[3] << ":"
<< (int)mac[4] << ":"
<< (int)mac[5] << endl;
f.close();
我尽了最大努力打磨它们,然后把它们都绕了10万次。以下是调查结果:
C程序:
real 0m 8.01s
user 0m 2.37s
sys 0m 5.58s
c++程序:
real 0m 6.07s
user 0m 3.18s
sys 0m 2.84s
目标文件大小:
C - 2,092 bytes
C++ - 3,272 bytes
结论:在我非常特定的平台上,使用非常特定的处理器,运行非常特定版本的Linux内核,运行一个非常特定版本的GCC编译的程序,以完成一个非常特定的任务,我会说c++方法更适合,因为它运行得更快,可读性更好。另一方面,C提供了小的内存占用,在我看来,这几乎没有什么意义,因为程序大小不是我们所关心的。
记住,YMMV。
其他回答
我想说,printf的可扩展性不足是不完全正确的: 在C语言中,它是真的。但是在C语言中,没有真正的类。 在c++中,可以重载强制转换操作符,因此,重载char*操作符并像这样使用printf:
Foo bar;
...;
printf("%s",bar);
可以是可能的,如果Foo重载好的操作符。或者你有一个好方法。简而言之,printf对我来说和cout一样具有可扩展性。
我可以看到c++流的技术参数(一般来说…不仅是cout.)是:
类型安全。(顺便说一下,如果我想打印一个'\n',我使用putchar('\n')…我不会用核弹杀死一只昆虫。) 更容易学。(不需要学习“复杂的”参数,只需使用<<和>>操作符) 本机使用std::string(对于printf有std::string::c_str(),但对于scanf?)
对于printf,我看到:
更容易,或至少更短(就书写的字符而言)复杂的格式。对我来说,可读性更强(我猜是品味问题)。 更好地控制函数所生成的内容(返回写入了多少字符并且有%n格式化程序:"Nothing printing . "参数必须是一个指向有符号整型的指针,其中存储到目前为止写入的字符数。”(from printf - c++ Reference) 更好的调试可能性。原因和上一个论点一样。
我个人倾向于使用printf(和scanf)函数,主要是因为我喜欢短行,而且我认为打印文本时的打字问题并不难避免。 我唯一对c风格函数感到遗憾的是std::string不受支持。在将其交给printf之前,我们必须通过一个char*(如果我们想读,则使用std::string::c_str(),但如何写?)
cout<< "Hello";
printf("%s", "Hello");
两者都用于打印值。它们有完全不同的语法。c++两者都有,C 只有printf。
对我来说,真正的区别是让我选择'cout'而不是'printf':
1) <<操作符可以为我的类重载。
2) cout的输出流可以很容易地更改为一个文件: (:复制粘贴:)
#include <iostream>
#include <fstream>
using namespace std;
int main ()
{
cout << "This is sent to prompt" << endl;
ofstream file;
file.open ("test.txt");
streambuf* sbuf = cout.rdbuf();
cout.rdbuf(file.rdbuf());
cout << "This is sent to file" << endl;
cout.rdbuf(sbuf);
cout << "This is also sent to prompt" << endl;
return 0;
}
3)我发现cout更具可读性,特别是当我们有很多参数时。
cout的一个问题是格式化选项。在printf中格式化数据(精度,合理性等)更容易。
一个是输出到标准输出的函数。另一个是一个对象,它提供了几个成员函数和输出到stdout的操作符<<的重载。我可以列举更多的不同之处,但我不确定你想要的是什么。
更多的差异: "printf"返回一个整数值(等于打印的字符数),"cout"不返回任何东西
And.
Cout << "y = " << 7;不是原子的。
Printf ("%s = %d", "y", 7);是原子的。
Cout执行类型检查,printf不执行。
iostream中没有% d的等价物