格式说明符的类型通道
Type channels for format specifiers
我的老师通常说printf 中的每个格式说明符都有一个管道通道。也就是说,%d 有一个管道通道,%f 有一个管道通道,依此类推。他说,对应于每个格式说明符的表达式被求值并插入到它的管道中,最后从中取出。他补充说,至少在 gcc 中,管道的填充(参数评估)是从右到左完成的,管道的清空(打印值)是从左到右完成的。
格式说明符的管道通道的概念是什么? 除了可能相关的 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 中的管道有关吗?
几乎你的导师所说的一切都是错误的。我从未听说过 "type channel" 或 "pipe channel" 这些术语与 C 编程有任何关系。
参数传递通常涉及函数调用堆栈,可能还涉及处理器寄存器。它不涉及 Unix 管道。
通常情况下 floating-point 参数是使用与整数不同的寄存器传递的。当 printf 说明符与其参数不匹配时(例如 %d
与 %f
),这可能会导致特别混乱。也许这就是您的导师试图解释的内容。
暗示函数参数的计算或消耗中存在任何 right-to-left 或 left-to-right 顺序的说法也不正确(或至少具有高度误导性)。例如,如果您要写
printf("a and b returned %d and %d\n", a(), b());
这确实会打印出函数 a()
和 b()
的 return 值,但是您无法知道这两个函数中的哪一个首先被调用。编译器可能会按任一顺序执行。
在 printf
的许多版本中有一个特殊的 rarely-used 功能,允许您使用数字来匹配 printf 格式说明符及其参数。您可以在 the Wikipedia article(他们将其称为 "parameter field")中阅读一些相关内容。但我怀疑你的导师是否在谈论那个。
我的老师通常说printf 中的每个格式说明符都有一个管道通道。也就是说,%d 有一个管道通道,%f 有一个管道通道,依此类推。他说,对应于每个格式说明符的表达式被求值并插入到它的管道中,最后从中取出。他补充说,至少在 gcc 中,管道的填充(参数评估)是从右到左完成的,管道的清空(打印值)是从左到右完成的。
格式说明符的管道通道的概念是什么? 除了可能相关的 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 中的管道有关吗?
几乎你的导师所说的一切都是错误的。我从未听说过 "type channel" 或 "pipe channel" 这些术语与 C 编程有任何关系。
参数传递通常涉及函数调用堆栈,可能还涉及处理器寄存器。它不涉及 Unix 管道。
通常情况下 floating-point 参数是使用与整数不同的寄存器传递的。当 printf 说明符与其参数不匹配时(例如 %d
与 %f
),这可能会导致特别混乱。也许这就是您的导师试图解释的内容。
暗示函数参数的计算或消耗中存在任何 right-to-left 或 left-to-right 顺序的说法也不正确(或至少具有高度误导性)。例如,如果您要写
printf("a and b returned %d and %d\n", a(), b());
这确实会打印出函数 a()
和 b()
的 return 值,但是您无法知道这两个函数中的哪一个首先被调用。编译器可能会按任一顺序执行。
在 printf
的许多版本中有一个特殊的 rarely-used 功能,允许您使用数字来匹配 printf 格式说明符及其参数。您可以在 the Wikipedia article(他们将其称为 "parameter field")中阅读一些相关内容。但我怀疑你的导师是否在谈论那个。