Введите каналы для спецификаторов формата
Мой учитель обычно говорит, что есть канал канала для каждого спецификатора формата в 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 с их аргументами. Вы можете немного прочитать об этом в статье в Википедии (где они называют это "полем параметра"). Но я сомневаюсь, что твой инструктор говорил об этом.