Как вызов printf() добавляет сюда числа?
-
21-12-2019 - |
Вопрос
Я не понимаю, как это 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
Решение
О, это умно.
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 - это какое значение, которое вы устанавливаете на определенную ширину (в EG, это 100)
Это означает, что конкретная ширина на самом деле подсчитывается и возвращает генеракодицетагкод
Но я думаю, что этот printf()
может только поединить с положительными числами, если один из номеров составляет <= 0, метод должен потерпеть неудачу, вы можете попробовать add()
, в моей собственной машине он все еще печатает 7 ...