Question

Je ne comprends pas comment ça printf() l'appel fonctionne pour additionner deux numéros.Est-ce que le %*c ça a quelque chose à voir avec ça ?

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

Pour appeler

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

Sortir

Sum=7
Était-ce utile?

La solution

Oh, c'est intelligent.

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

Sur le succès, printf() renverra le nombre de caractères imprimés, et "%*c", x, '\r' dis-lui d'imprimer x personnages (x-1 espaces suivis d'un \r).Donc, printf("%*c%*c", x, '\r', y, '\r') renverra le nombre de caractères imprimés, ce qui est x+y.

Voir printf(3) pour plus de détails.


Note:

Comme l'a souligné @shole, ce int add(int x, int y) travaux seulement pour les deux x et y sont des entiers non négatifs.Par exemple:

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

Autres conseils

Lorsqu'il est transmis à printf (ou fonctions similaires), %*c signifie que vous transmettez deux paramètres au lieu d'un.Le premier paramètre spécifie une largeur de champ et le second un caractère (ou une chaîne, un entier, etc.) à écrire dans cette largeur de champ.

printf renvoie le nombre total de caractères écrits dans le flux de sortie.

Un numéro après % spécifie la largeur du champ ;donc %5c imprimera 4 espaces, suivis de l'argument caractère, donnant un total de 5 caractères.

* spécifie que la largeur du champ est fournie comme argument à printf.Cela imprimera donc un champ de x personnages, suivis d'un autre de y personnages.Chaque champ est constitué d'espaces suivis d'un retour chariot ('\r'), il ne devrait donc y avoir aucune sortie visible. printf renvoie le nombre total de caractères imprimés - dans ce cas, x+y.

je suis d'accord avec leeduhem, c'est extrêmement intelligent,

printf() renvoie le nombre de caractères imprimés.Pour l'argument, je pense qu'il est plus facile à comprendre avec un exemple :(vous pouvez également voir l'astuce de largeur dans ici:

#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 est la valeur que vous définissez pour spécifier la largeur (par exemple, c'est 100)

Cela signifie que la largeur que vous spécifiez est réellement comptée et renvoyée par le printf()

Mais je pense que ça add() ne peut se battre qu'avec des nombres positifs, si l'un des nombres est <= 0, la méthode devrait échouer, vous pouvez essayer add(-3,-4), sur ma propre machine, il imprime toujours 7...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top