Como chamar printf() adiciona números aqui?
-
21-12-2019 - |
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
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 ...