printf()将其参数转换为像cout一样的字符串吗?

时间:2016-04-22 13:54:00

标签: c++ c

我开始从C学习C ++。最近,我刚刚阅读了一本关于C ++的教程。在介绍流一节中,该书已经注意到:

  

<<运算符重载,以便右边的操作数可以   字符串或任何原始值。如果此操作数不是字符串,则   <<运算符在将其发送到输出之前将其转换为字符串形式   流。

所以我想知道C中的printf()函数是否具有相同的效果。如果它没有,请告诉我两者之间的差异。

2 个答案:

答案 0 :(得分:7)

当然,它必须以某种方式生成每个参数的字符串表示,这是为了打印一些东西所需要的。打印包括将字符流发送到输出设备,除非您有一系列字符,否则无法打印。

printf()函数使用格式化字符串来控制如何解释每个参数以创建字符表示,以及如何在输出时格式化该表示。

请注意,没有"转换"当然,可以从外部看到论证。没有办法

printf("%d\n", 47);

可以将47放到一个字符串中; C使用call by value,因此函数只获取值的副本,然后使用%d转换说明符中隐含的类型信息来确定如何生成两个字符'4'和{{ 1}}构成印刷表示。

答案 1 :(得分:2)

  

所以我想知道C中的printf()函数是否具有相同的效果。

C和C ++都使用流来输出。在C中它是stdout,在C ++中它是cout

虽然从语句printf写入标准输出(stdout)说明终端是不明显的。

在cout的情况下,从声明本身可以看出输出正在进行。

一些微妙的差异

使用cout你可能需要包含一个额外的标题 - 比如说iomanip - 并使用一些函数 - 比如setw() - 来进行精细格式化,就像在printf中依赖于格式字符串一样。

性能 - 每个都有自己的优势,具体取决于您打印的内容和打印位置。我从here.

借用了这一点

另一种相似性

C ++和C标准都没有提及函数参数的评估顺序。所以你不能尝试功能性的花哨的东西。例如,你不应该做

printf(%d%d",++i,i++); // The behaviour is undefined.

也不应该

cout<<++i<<++i; // The behaviour is undefined.

注意:

请记住,如果包含必要的标题,则c流可在C ++中使用。