我的老师通常说printf中的每个格式说明符都有一个管道通道。也就是说,%d有一个管道通道,%f有一个管道通道,依此类推。他说,将评估与每个格式说明符相对应的表达式,并将其插入其管道中,最后从管道中获取。他补充说,至少在gcc中,管道的填充(参数评估)是从右到左完成的,而管道的清空(打印值)是从左到右完成的。
用于格式说明符的管道通道的概念是什么? 除了可能相关的pipe()函数外,我看不到它。以下是一个相关的问题:fork() and pipes() in c。
引用该问题的答案,
管道是用于进程间通信的机制。一个进程写入管道的数据可以被另一个进程读取。创建管道的原语是pipe()函数。这将创建管道的读取端和写入端。
编译器是否使用管道机制以这种方式执行printf语句?这与Linux中的管道传输有关吗?
最佳答案
您的教练说的几乎所有东西都是错误的。我从未听说过术语“类型通道”或“管道通道”与C编程有关。
参数传递通常涉及函数调用堆栈,可能还涉及处理器寄存器。它不涉及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/