c - 格式说明符的类型 channel

标签 c format-specifiers

我的老师通常说 printf 中的每个格式说明符都有一个管道 channel 。也就是说,%d 有一个管道 channel ,%f 有一个管道 channel ,依此类推。他说,对应于每个格式说明符的表达式被求值并插入到它的管道中,最后从中取出。他补充说,至少在 gcc 中,管道的填充(参数评估)是从右到左完成的,管道的清空(打印值)是从左到右完成的。

格式说明符的管道 channel 概念是什么? 除了可能相关的 pipe() 函数外,我在任何地方都看不到它。以下是相关问题:fork() and pipes() in c .

引用该问题的答案,

A pipe is a mechanism for interprocess communication. Data written to the pipe by one process can be read by another process. The primitive for creating a pipe is the pipe() function. This creates both the reading and writing ends of the pipe.

编译器是否使用管道机制以这种方式执行 printf 语句?这与 Linux 中的管道有关吗?

最佳答案

几乎你的导师所说的一切都是错误的。我从未听说过与 C 编程有任何关系的术语“类型 channel ”或“管道 channel ”。

参数传递通常涉及函数调用堆栈,可能还涉及处理器寄存器。它不涉及 Unix 管道。

通常情况下,浮点参数是使用与整数不同的寄存器传递的。当 printf 说明符与其参数不匹配时(例如 %d%f),这可能会导致特别困惑。也许这就是您的导师试图解释的内容。

暗示在函数参数的计算或使用中存在任何从右到左或从左到右的顺序也是不正确的(或者至少是高度误导的)。例如,如果你要写

printf("a and b returned %d and %d\n", a(), b());

这确实会打印出函数 a()b() 的返回值,但是您无法知道这两个函数中的哪一个被调用了第一的。编译器可能会按任一顺序执行。

printf 的许多版本中有一个很少使用的特殊功能,它允许您使用数字来匹配 printf 格式说明符及其参数。您可以在 the Wikipedia article 中阅读一些相关信息(他们称之为“参数字段”)。但我怀疑你的导师是否在谈论那个。

关于c - 格式说明符的类型 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49345685/

相关文章:

c - 如果单词出现在单词数组中,则排除该单词

c - 如果违反了 "shall/shall not"要求,那么该要求位于哪个部分(例如语义、约束)是否重要?

创建随机数

c++ - 要在 scanf() 的扫描集中包含一个连字符作为元素,它应该是列表中的第一个字符还是最后一个字符?

c - 'Most C system provide for logically infinite floating values' 是什么意思?

c - 如果不能保证参数的评估顺序,编译器如何知道数组的维度

c - 如何使用 C 代码将 linux 命令的结果复制到字符串中?

ios - 将对象中的值从 1 更改为 true

c - 为什么printf只接受多个 "%"?

c - Scanf() - %a 格式/转换说明符是什么?