Как нижеприведенный макрос работает на языке программирования c?

Код:

#include <stdio.h>
#define puts "%s C preprocessor"
int main()
{
    printf(puts, puts);
    return 0;
}

Выход:

%s C preprocessor C preprocessor

Смотрите также...

Может ли кто-нибудь объяснить мне логику этого вывода?

Я пытался решить ее, но не получил должного объяснения от своих друзей. Если кто-нибудь может объяснить мне, это будет очень полезно.

Почтовый код в виде текста здесь вместо внешней ссылки на изображение. Расскажите нам, что вы сделали до сих пор, чтобы решить вашу проблему. Макросы описаны в любом учебнике на c. Не кричите (используйте все заглавные буквы).

Allan Wind 27.11.2022 10:06

Каково ваше самое близкое объяснение, которое вы можете придумать? Что вы узнали, как макрос заменяется препроцессором? Какой части не хватает, чтобы получить результат?

Gerhardh 27.11.2022 10:17

@AllanWind, ты не кричи

sakshi monst 29.11.2022 09:14

@Gerhardh, ни одна часть не пропущена. ближайшим объяснением будет % s принимает следующий аргумент в виде строки

sakshi monst 29.11.2022 09:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Макрос let to (код после компоновщика):

int main
{
    printf("%s C preprocessor", "%s C preprocessor");
    return 0;
}

printf работает как:

Результат тогда

%s C preprocessor C preprocessor

в чем причина этого вывода?

sakshi monst 29.11.2022 09:12

А, причина этого аутпула? почему %s печатается?

sakshi monst 29.11.2022 09:16

Ну сначала компоновщик меняет код из-за макросов. Тогда в printf есть 2 одинаковые строки. Первая строка принимается как строка форматирования, вторая — как простая строка. Затем printf заменяет "%s" в строке форматирования вторым аргументом. Там «%s» не будет заменено, потому что его нет в строке формата.

Andy A. 29.11.2022 09:17

Добавлено изображение того, как работает подстановка в printf

Andy A. 29.11.2022 09:21

если мне нужно подробно рассмотреть эту тему о formatstring, какую тему вы бы посоветовали мне изучить?

sakshi monst 29.11.2022 09:22

Изображение в ответе. Я добавил его туда. - А чтобы получить информацию о printf, введите ее в свой любимый поисковик.

Andy A. 29.11.2022 09:26

Спасибо, Энди, это так ясно с помощью изображения.

sakshi monst 29.11.2022 09:29

"Ein Bild sagt mehr als tausend Worte" :-) ... Один взгляд стоит тысячи слов

Andy A. 29.11.2022 09:31

да, абсолютно😃😃

sakshi monst 29.11.2022 09:34

еще один момент, в этом printf работает справа налево?

sakshi monst 29.11.2022 09:39

А теперь, будьте так добры, перепишите свой вопрос строчными буквами. Писать все заглавными буквами считается грубым!

Andy A. 29.11.2022 09:39
printf ( FORMAT, LIST ) -> printf ( FORMAT, x, y, z) -> Все «%» в «ФОРМАТ» будут заменены элементами списка. Учебник смотреть надо!!!
Andy A. 29.11.2022 09:43

Я не знал, что заглавные буквы считаются грубыми. Спасибо что сказал мне.

sakshi monst 29.11.2022 09:45

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