Путаница относительно заявления printf

Так что я запускал этот код

#include int add(int x, int y) { return printf("%*c%*c",x ,' ',y,' '); } int main() { printf("Sum = %d", add(3,4)); return 0; } 

И, похоже, не может понять, как работает следующее утверждение

 return printf("%*c%*c",x ,' ',y,' '); 

Поэтому я попробовал написать простой код

 int x=3; printf("%*c",x); 

и я получил странный специальный символ (некоторые пробелы перед ним) как вывод

 printf("%*c",x,' '); 

У меня нет выхода. Я понятия не имею, что происходит? Пожалуйста помоги. Спасибо.

Этот код

 int x=3; printf("%*c",x,'a'); 

использует минимальную ширину символов, которая может быть задана для каждого входного параметра printf .

То, что указано выше, это распечатать символ a , но указывает, что минимальная ширина будет символом x поэтому выход будет символом, которому предшествуют 2 пробела.

Спецификатор * указывает printf что ширина части выходной строки, сформированной из этого входного параметра, будет минимальной шириной x символов, где x должен быть передан как дополнительный аргумент перед переменной, которая должна быть напечатана. Дополнительная ширина (если требуется) формируется из пробелов, выходящих перед печатаемой переменной. В этом случае ширина равна 3, и поэтому выходная строка (исключая кавычки, которые есть только для иллюстрации пробелов)

 " a" 

С кодом здесь

 printf("%*c",x); 

вы передали значение длины, но забыли фактически передать переменную, которую вы хотите напечатать.

Итак, этот код

 return printf("%*c%*c",x ,' ',y,' '); 

в основном говорит, чтобы напечатать символ пробела, но с минимальной шириной x символов (с кодом x = 3), затем напечатать пробел с минимальным количеством символов y (в вашем коде y = 4).

В результате вы печатаете 7 пробелов. Эта длина является возвращаемым значением printf (и, следовательно, вашей функцией add ), что подтверждается выходом

 Sum = 7 

из printf внутри main() .

Если вы измените свой код на

 return printf("%*c%*c",x ,'a',y,'b'); 

вы увидите строку (очевидно, исключая кавычки)

 " ab" 

чтобы сделать то, что происходит более ясно.

Попробуйте напечатать это правильно. %d – для печати целых чисел, %c – для печати символа.

В вашем коде:

 int x=3; printf("%*c",x); 

x – количество пробелов, которое получит char, вы пишете 3. Но вы не поместили символ, который хотите распечатать, чтобы он печатал мусор.

Когда вы пишете:

 printf("%*c",x,' '); 

Вы печатаете пробел ' ' char внутри 3-х символов. То же самое, когда вы это делаете
printf("%*c",x, ' ',y,' '); – всего 7 пробелов. Результат правильный, потому что printf возвращает количество символов, которые он пишет.

Посмотрите здесь дополнительные форматы printf .