Как вызов printf () добавляет сюда числа?


Я не понимаю, как этот вызов printf() работает, чтобы сложить два числа. Имеет ли %*c какое-то отношение к этому?

//function that returns the value of adding two number
int add(int x, int y)
{
    NSLog(@"%*c",x, 'r');
    NSLog(@"%*c",y, 'r');
    return printf("%*c%*c",  x, 'r',  y, 'r'); // need to know detail view how its working
}

Для вызова

printf("Sum = %d", add(3, 4));

Вывод

Sum=7
4 2

4 ответа:

О, это умно.

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

При успешном выполнении printf() вернет, сколько символов он напечатал, и "%*c", x, '\r' скажет ему напечатать x символов (x-1 пробелов, за которыми следует один \r). Таким образом, printf("%*c%*c", x, '\r', y, '\r') вернет количество напечатанных символов, которое равно x+y.

См.printf(3) для более подробной информации.


Примечание:

Как указывает @shole, это int add(int x, int y) работает только для x и y неотрицательных целых чисел. Для пример:

add(-1, 1) // gives 2 instead of 0
add(0, 1)  // gives 2 instead of 1

При передаче в printf (или аналогичные функции), %*c означает, что вы передаете два параметра вместо одного. Первый параметр задает ширину поля, а второй-символ (или строку, int и т. д.) чтобы записать в этой ширине поля.

printf возвращает общее количество символов, записанных в выходной поток.

Число после % задает ширину поля; таким образом, %5c выведет 4 пробела, за которыми следует аргумент символа, дающий в общей сложности 5 символов.

* указывает, что ширина поля предоставляется в качестве аргумента printf. Таким образом, будет выведено одно поле символов x, за которым следует другое из символов y. Каждое поле состоит из пробелов, за которыми следует возврат каретки ('\r'), поэтому не должно быть никаких видимых выходных данных. printf возвращает общее количество напечатанных символов. этот случай, x+y.

Я согласен с лидухемом, он чрезвычайно умен,

printf() верните номер символа, который он напечатал. Что касается аргумента, я думаю, что его легче понять с помощью примера: (также вы можете увидеть трюк ширины в здесь:

#include <iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

int main() {
    // your code goes here
    int x = printf("%*c", 100, '\r');
    printf("%d\n", x);
    return 0;
}

X-это любое значение, которое вы задаете для конкретной ширины (например, это 100)

Это означает, что ширина, которую вы определяете, фактически подсчитывается и возвращается printf()

Но я думаю, что это add() может быть только дуэль с положительными числами, если одно из чисел add(-3,-4), в моей собственной машине он все еще печатает 7...