Код:
#include <stdio.h>
#define puts "%s C preprocessor"
int main()
{
printf(puts, puts);
return 0;
}
Выход:
%s C preprocessor C preprocessor
Может ли кто-нибудь объяснить мне логику этого вывода?
Я пытался решить ее, но не получил должного объяснения от своих друзей. Если кто-нибудь может объяснить мне, это будет очень полезно.
Каково ваше самое близкое объяснение, которое вы можете придумать? Что вы узнали, как макрос заменяется препроцессором? Какой части не хватает, чтобы получить результат?
@AllanWind, ты не кричи
@Gerhardh, ни одна часть не пропущена. ближайшим объяснением будет % s принимает следующий аргумент в виде строки
Добро пожаловать в Stack Overflow! Пожалуйста, отредактируйте свой пост, чтобы добавить код и данные в виде текста ( с использованием форматирования кода ), а не изображений. Изображения: A) не позволяйте нам копировать и вставлять код/ошибки/данные для тестирования; Б) не разрешать поиск по коду/ошибке/содержимому данных; и много других причин . Изображения следует использовать в дополнение к тексту в формате кода только в том случае, если изображение добавляет что-то важное, что не передается только текстовым кодом/ошибкой/данными. См. минимальный воспроизводимый пример того, какой код требуется.
Макрос let to (код после компоновщика):
int main
{
printf("%s C preprocessor", "%s C preprocessor");
return 0;
}
printf
работает как:
Результат тогда
%s C preprocessor C preprocessor
в чем причина этого вывода?
А, причина этого аутпула? почему %s печатается?
Ну сначала компоновщик меняет код из-за макросов. Тогда в printf есть 2 одинаковые строки. Первая строка принимается как строка форматирования, вторая — как простая строка. Затем printf заменяет "%s" в строке форматирования вторым аргументом. Там «%s» не будет заменено, потому что его нет в строке формата.
Добавлено изображение того, как работает подстановка в printf
если мне нужно подробно рассмотреть эту тему о formatstring, какую тему вы бы посоветовали мне изучить?
Изображение в ответе. Я добавил его туда. - А чтобы получить информацию о printf, введите ее в свой любимый поисковик.
Спасибо, Энди, это так ясно с помощью изображения.
"Ein Bild sagt mehr als tausend Worte" :-) ... Один взгляд стоит тысячи слов
да, абсолютно😃😃
еще один момент, в этом printf работает справа налево?
А теперь, будьте так добры, перепишите свой вопрос строчными буквами. Писать все заглавными буквами считается грубым!
printf ( FORMAT, LIST )
-> printf ( FORMAT, x, y, z)
-> Все «%» в «ФОРМАТ» будут заменены элементами списка. Учебник смотреть надо!!!
Я не знал, что заглавные буквы считаются грубыми. Спасибо что сказал мне.
Почтовый код в виде текста здесь вместо внешней ссылки на изображение. Расскажите нам, что вы сделали до сих пор, чтобы решить вашу проблему. Макросы описаны в любом учебнике на c. Не кричите (используйте все заглавные буквы).