Sumando dos números sin utilizar operadores.

Encontré este código siguiente para agregar dos números sin usar el operador + .

Código para añadir 3 y 4:

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

Ahora printf() devuelve la cantidad 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 carácter c , n veces. Por lo tanto, 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 printf interno genera 3 espacios, luego 4 espacios y devuelve el número de caracteres, que es 7, y el printf externo está imprimiendo ese resultado.

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

Aquí se utiliza el valor de retorno de printf . Respectivamente, 3-1 espacios ( ' ' ) y luego nuevamente espacio (como usted especificó) y 4-1 espacios y luego nuevamente se está imprimiendo 1 espacio. Y luego se devuelve el número total de caracteres escritos. Así se hace la sum.

Acabo de recordar esta regla

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

Todos estos comportamientos se explican en el Estándar C11.

De la norma §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 manera predeterminada) a la izquierda (o a la derecha, si se ha asignado 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 indicó anteriormente, un ancho de campo, o precisión, o ambos, pueden estar indicados por un asterisco. En este caso, un argumento int proporciona el ancho o la precisión del campo

Al final §7.21.6.1.p14

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


Para borrar su idea, este ejemplo será lo suficientemente bueno (estoy usando %d aquí para que obtenga la 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.