Domanda

Non capisco come questa chiamata printf() sta funzionando per aggiungere due numeri.Il %*c ha qualcosa a che fare con questo?

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

per chiamare

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

Uscita

Sum=7
.

È stato utile?

Soluzione

Oh, questo è intelligente.

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

On Success, printf() restituirà quanti carattere è stato stampato e "%*c", x, '\r' Dicarlo per stampare caratteri x (spazi x-1 seguiti da un \r).Pertanto, printf("%*c%*c", x, '\r', y, '\r') restituirà il numero di caratteri stampati, che è x+y.

Guarda printf(3) per ulteriori dettagli.


.

Nota:

Come sottolineato da @shole , questo int add(int x, int y) funziona solo per x e y sono numeri interi non negativi .Ad esempio:

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

Altri suggerimenti

Quando è passato a printf (o funzioni simili), %*c significa che stai passando due parametri invece di uno.Il primo parametro specifica una larghezza del campo e il secondo carattere (o stringa, int, ecc.) Scrittura in quella larghezza del campo.

printf restituisce il numero totale di caratteri scritti sul flusso di uscita.

Un numero dopo % Specifica la larghezza del campo;Quindi %5c stampierà 4 spazi, seguito dall'argomento carattere, dando un totale di 5 caratteri.

* Specifica che la larghezza del campo è fornita come argomento a printf.Quindi questo stampa un campo di caratteri x, seguito da un altro dei caratteri y.Ogni campo è composto da spazi seguiti da un carrello-ritorno ('\r'), quindi non dovrebbe esserci alcuna output visibile.printf restituisce il numero totale di caratteri stampati - in questo caso, x+y.

Sono d'accordo con Leeduhem, è estremamente intelligente,

printf() restituisce il numero di caratteri che ha stampato. Per l'argomento, penso che sia più facile capire con un esempio: (anche puoi vedere il trucco della larghezza in qui :

#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 è qualsiasi valore impostato su specifica la larghezza (nell'eG, è 100)

Significa che la larghezza specifica è effettivamente contata e ritorna dal printf()

ma penso che questo add() può solo duello con numeri positivi, se uno del numero è <= 0, il metodo dovrebbe fallire, è possibile provare add(-3,-4), nella mia macchina Stampa ancora 7 ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top