Как работает этот трюк printf - PullRequest
0 голосов
/ 14 декабря 2018

Взято из здесь :

printf("%d", printf("%*s%*s",a,"\r",b,"\r") );

Напечатает результат a + b.

Как на земле это работает?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Поскольку printf возвращает количество символов в выводе, а спецификатор %*s фактически читает два аргумента (целое число и символ) и печатает символ с отступом (таким образом, перед ним печатаются n-1 пробелы), по существу,внутренний printf напечатан a + b \r с, а внешний printf напечатан этот номер.

0 голосов
/ 14 декабря 2018

Второй (внутренний) printf выполняет печать столько символов, сколько a, а затем столько же символов, сколько b.printf возвращает количество напечатанных символов, таким образом, сумма a и b.

Теперь давайте немного глубже printf("%*s", a, "\r") напечатает строку с шириной, указанной с помощью параметра (в этомcase a) - это то, что делает звездочка.По умолчанию строка остается дополненной пробелами.Таким образом, вы получите a - 1 пробелов и символ возврата каретки.Сделав это дважды: printf("%*s%*s",a,"\r",b,"\r") сначала напечатает строку с шириной, установленной на значение a, а затем вторую строку с шириной, установленной на значение b.

После этого внешний printf напечатает число, соответствующее количеству символов, напечатанных внутренним printf, но мы уже знаем, что это будет, не так ли?

ПРИМЕЧАНИЕ: поскольку левое отступление может только добавить, никогда не будетудалить символы, код на самом деле неверен для a = 0 или b = 0 (или, конечно, негативов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...