Вопрос

Я не понимаю, как это 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 ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top