He encontrado una función algo peculiar la cual calcula el cuadrado de un determinado numero, hasta ahi todo bien pero lo que me llama la atención es el metodo utilizado para llegar a ello.
#include <stdio.h>
int p(int n)
{
int a[n];
return (&a)[n] - a;
}
int main(void)
{
printf("%d\n", p(8));
return 0;
}
Como se daran cuenta a simple vista uno no supondría que esto saca el cuadrado de un numero es algo confuso y pido que alguien me explique detalladamente como funciona esto
http://stackoverflow.com/questions/27828822/cant-understand-this-way-to-calculate-the-square-of-a-number (http://stackoverflow.com/questions/27828822/cant-understand-this-way-to-calculate-the-square-of-a-number)
De cualquier modo, es puramente curioso. usa n*n xD
Cita de: CooperJames en 29 Marzo 2015, 19:29 PMHe encontrado una función algo peculiar la cual calcula el cuadrado de un determinado numero, hasta ahi todo bien
El problema con esa forma de obtener el cuadrado es que tal vez funcione o tal vez no ya que la expresión genera UB (comportamiento no definido), la explicación en detalle se encuentra en el vinculo cortesía de
ivancea96.
Un saludo
ivancea96 gracias por el enlace lo acabo de leer y en el mismo mencionan que
(&a)[n] -a
Es equivalente a
(a + sizeof(a[n])*n -a) / sizeof(int)
Lo cual no entiendo porque, si me explican como va esto
(a + sizeof(a[n])*n -a) / sizeof(int)
Por partes:
1) Ya que "a" se suma y luego se resta la quitamos de la expresión, queda "(sizeof(a[n]) * n) / sizeof(int)".
2) "sizeof(a[n])" es el numero de bytes necesarios para almacenar el array de tipo "int [n]".
3) Multiplicado por "n" es el numero de bytes necesario para almacenar "n" arrays de tipo "int [n]".
4) Para quitar al tipo int de la ecuación se divide por "sizeof(int)", con lo que terminamos con solo la multiplicación "n * n".
Un saludo