Suma de dos números sin usar operadores

3 minutos de lectura

Suma de dos numeros sin usar operadores
Peps0791

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.

  • 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

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.

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

    –MM

    27 de diciembre de 2017 a las 6:32

1647633966 344 Suma de dos numeros sin usar operadores
Basile Starynkevitch

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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad