2012-09-08 19 views
9

Encontré este código siguiente para la adición de dos números sin usar el operador +.Agregar dos números sin usar operadores

código para agregar 3 y 4:

printf("%d",printf("%*c%*c",3,' ',4,' ')); 

Ahora printf() devuelve el número de caracteres en el resultado y %*c ignora el siguiente carácter que se encuentra. Pero aún así, no puedo entender este código. Cualquier ayuda sería apreciada.

+0

Este código tiene también algo significativo efecto secundario. –

+0

único efecto secundario que sé es que cambia la salida de acuerdo con la cantidad de espacios que recibe como entrada. Algo más ? – Peps0791

+3

Pero ese efecto secundario es importante. No puedes simplemente decir que es una forma extraña de hacer una adición. –

Respuesta

9

printf("%*c", n, c) imprime el carácter c, n veces. Entonces el código imprime 3 espacios seguidos por 4 espacios, y printf devuelve el número de caracteres impresos, que obviamente es 3 + 4, completando el problema.

+2

En realidad, imprime el carácter 'c' justificado a la derecha en un ancho de campo' n', rellenado con espacios. (No rellenado con copias de 'c' como lo sugiere su respuesta) –

5

El printf interno emite 3 espacios y luego devuelve el número de caracteres, que es 7, y el printf externo está imprimiendo ese resultado.

1

Estoy agregando esta respuesta para especificar las reglas de la norma.

Aquí se está utilizando el valor de retorno de printf. Respectivamente 3-1 espacios (' ') y luego otra vez espacio (como usted especificó) y 4-1 espacios y luego nuevamente se está imprimiendo 1 espacio. Y luego se devuelve la cantidad total de caracteres escritos. Así es como se hace la suma.

acabo de recordar esta regla

printf("%*c",X,C) prints the char C in a field of size X 

Todas estas comportamiento se explica en C11 estándar.

De estándar §7.21.6.1p4

Una anchura de campo mínimo opcional. Si el valor convertido tiene menos caracteres que el ancho de campo, se rellena con espacios (por defecto) a la izquierda (o hacia la derecha, si el indicador de ajuste izquierdo, descrito más adelante, se ha dado) a la ancho de campo El ancho del campo toma la forma de un asterisco * (descrito más adelante) o un entero decimal no negativo.

Y en la misma sección §7.21.6.1p5

Como se señaló anteriormente, una anchura de campo, o la precisión, o ambos, pueden ser indicado por un asterisco.En este caso, un argumento int suministra el ancho campo o la precisión

Por fin §7.21.6.1.p14

La función fprintf devuelve el número de caracteres transmitidos o un valor negativo si se produjo un error de salida o codificación.


para despejar su idea de este ejemplo será lo suficientemente bueno (estoy usando %d aquí para que se entiende la idea del campo).

Si x = 10 y y=2 entonces será

printf("%*d%*d", x, x, y, y); 

Más claramente

| | | | | | | | |1|0| |2| 
1 2 3 4 5 6 7 8 9 10 \ \ 
         11 12 

That's how 12 characters are printed. 
Cuestiones relacionadas