Введите каналы для спецификаторов формата

Мой учитель обычно говорит, что есть канал канала для каждого спецификатора формата в printf. То есть канал для%d, канал для%f и т. Д. Он говорит, что выражения, соответствующие каждому спецификатору формата, оцениваются и вставляются в его канал и, наконец, извлекаются из него. Он добавляет, по крайней мере, в gcc, заполнение каналов (оценка аргумента) выполняется справа налево, а очистка каналов (печать значений) выполняется слева направо.

Что это за концепция каналов каналов для спецификаторов формата? Я не мог видеть это нигде, кроме, возможно, связанной функции pipe(). Следующее - связанный вопрос: fork () и pipe() в c.

Цитируя ответ на этот вопрос,

Труба - это механизм межпроцессного взаимодействия. Данные, записанные в канал одним процессом, могут быть прочитаны другим процессом. Примитивом для создания канала является функция pipe(). Это создает как чтение, так и запись конца канала.

Компилятор использует механизм конвейера для выполнения оператора printf таким образом? Это связано с трубопроводом в Linux?

1 ответ

Решение

Почти все, что сказал твой инструктор, неверно. Я никогда не слышал, чтобы термины "тип канала" или "канал канала" имели какое-либо отношение к программированию на Си.

Передача аргументов обычно включает стек вызовов функций и, возможно, регистры процессора. Он не имеет ничего общего с трубами Unix.

Часто случается, что аргументы с плавающей точкой передаются с использованием регистров, отличных от целых чисел. Это может привести к особой путанице, когда у вас есть несоответствия между спецификаторами printf и их аргументами (например, %d против %f). Возможно, это то, что ваш инструктор пытался объяснить.

Также неверно (или, по крайней мере, вводит в заблуждение) предположение, что в оценке или использовании аргументов функции есть какое-либо упорядочение справа налево или слева направо. Например, если вы должны были написать

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

это действительно распечатало бы возвращаемые значения функций a() а также b(), но у вас не было бы возможности узнать, какая из двух функций была вызвана первой. Компилятор может сделать это в любом порядке.

Во многих версиях есть специальная, редко используемая функция. printf это позволяет вам использовать числа, чтобы сопоставить спецификаторы формата printf с их аргументами. Вы можете немного прочитать об этом в статье в Википедии (где они называют это "полем параметра"). Но я сомневаюсь, что твой инструктор говорил об этом.

Другие вопросы по тегам