Encontré este siguiente código para la suma de dos números sin usar el +
operador.
código para sumar 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 encuentra. Pero aún así, no puedo entender este código. Cualquier ayuda sería apreciada.
printf("%*c", n, c)
imprime el caracter c
, n
veces. Entonces el código imprime 3 espacios seguidos de 4 espacios, y printf
devuelve el número de caracteres impresos, que obviamente es 3 + 4, completando el problema.
El interior printf
genera 3 y luego 4 espacios y devuelve el número de caracteres, que es 7, y el exterior printf
está imprimiendo ese resultado.
Estoy agregando esta respuesta para especificar las reglas del estándar.
Aquí esto está utilizando el valor de retorno de printf
. Respectivamente 3-1
espacios(' '
) y luego otra vez el espacio (como usted especificó) y 4-1
espacios y luego nuevamente 1 espacio se está imprimiendo. Y luego se devuelve el número total de caracteres escritos. Así se va haciendo la suma.
solo recuerdo esta regla
printf("%*c",X,C) prints the char C in a field of size X
Todo este comportamiento se explica en el estándar C11.
De estándar §7.21.6.1p4
Un ancho de campo mínimo opcional. Si el valor convertido tiene menos caracteres que el ancho del campo, se rellena con espacios (de forma predeterminada)
a la izquierda (oa la derecha, si se ha dado el indicador de ajuste izquierdo, descrito más adelante) al ancho del 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, un ancho de campo, o precisión, o ambos, pueden indicarse con un asterisco. En este caso, un argumento int proporciona el ancho de campo o la precisión.
Por fin §7.21.6.1.p14
los fprintf
función devuelve el número de caracteres transmitidoso un valor negativo si se produjo un error de salida o de codificación.
Para aclarar su idea, este ejemplo será lo suficientemente bueno (estoy usando %d
aquí para que os hagáis una idea del campo).
Si x = 10
y y=2
entonces será
printf("%*d%*d", x, x, y, y);
Mas claro
| | | | | | | | |1|0| |2|
1 2 3 4 5 6 7 8 9 10 \ \
11 12
That's how 12 characters are printed.
Ese código también tiene algunos efectos secundarios significativos.
– Basile Starynkevitch
8 de septiembre de 2012 a las 13:59
El único efecto secundario que conozco es que cambia la salida de acuerdo con la cantidad de espacios que obtiene como entrada. Algo más ?
– Peps0791
8 de septiembre de 2012 a las 14:14
Pero ese efecto secundario es importante. No puedes decir simplemente que es una forma extraña de hacer una suma.
– Basile Starynkevitch
8 de septiembre de 2012 a las 14:16