Pergunta

Eu não entendo como isso printf() call está trabalhando para somar dois números.Será que o %*c tem algo a ver com isso?

//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
}

para chamar

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

Saída

Sum=7
Foi útil?

Solução

Ah, isso é inteligente.

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

No sucesso, printf() retornará quantos caracteres foram impressos e "%*c", x, '\r' diga para imprimir x personagens (x-1 espaços seguidos por um \r).Portanto, printf("%*c%*c", x, '\r', y, '\r') retornará quantos caracteres são impressos, o que é x+y.

Ver printf(3) para mais detalhes.


Observação:

Como apontado por @shole, esse int add(int x, int y) funciona apenas para ambos x e y são inteiros não negativos.Por exemplo:

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

Outras dicas

Quando passado para printf (ou funções semelhantes), %*c significa que você está passando dois parâmetros em vez de um.O primeiro parâmetro especifica a largura do campo e o segundo um caractere (ou string, int, etc.) para escrever nessa largura do campo.

printf retorna o número total de caracteres gravados no fluxo de saída.

Um número depois % especifica a largura do campo;então %5c imprimirá 4 espaços, seguidos pelo argumento do caractere, totalizando 5 caracteres.

* especifica que a largura do campo é fornecida como um argumento para printf.Então isso imprimirá um campo de x caracteres, seguido por outro de y personagens.Cada campo consiste em espaços seguidos por um retorno de carro ('\r'), portanto não deve haver nenhuma saída visível. printf retorna o número total de caracteres impressos - neste caso, x+y.

concordo com Leeduhem, é extremamente inteligente,

printf() retorne o número de caracteres impressos.Para o argumento, acho que é mais fácil de entender com um exemplo:(Você também pode ver o truque da largura em aqui:

#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 é qualquer valor que você definiu para especificar a largura (por exemplo, é 100)

Isso significa que a largura que você especificou é realmente contada e retornada pelo printf()

Mas eu acho que isso add() só pode duelar com números positivos, se um dos números for <= 0, o método deve falhar, você pode tentar add(-3,-4), na minha própria máquina ainda imprime 7 ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top