键入格式说明符的通道

时间:2018-03-18 07:54:29

标签: c format-specifiers

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

格式说明符的管道通道的概念是什么?除了可能相关的pipe()函数之外,我无法看到它。以下是一个相关问题:fork() and pipes() in c

引用该问题的答案,

  

管道是进程间通信的机制。通过一个进程写入管道的数据可以由另一个进程读取。创建管道的原语是pipe()函数。这会创建管道的读写端。

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

1 个答案:

答案 0 :(得分:2)

几乎所有教师说的都是错的。我从未听过与C编程有关的术语“类型通道”或“管道通道”。

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

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

在评估或消费函数参数时,建议存在任何从右到左或从左到右的排序也是不正确的(或者至少是高度误导性的)。例如,如果你要写

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

这确实会打印出函数a()b()的返回值,但是你无法知道先调用哪两个函数。编译器可以按任何顺序执行此操作。

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