I have found a function that calculates square of a number:
int p(int n) {
int a[n]; //works on C99 and above
return (&a)[n] - a;
}
It returns value of n2. Question is, how does it do that? After a little testing, I found that between (&a)[k]
and (&a)[k+1]
is sizeof(a)
/sizeof(int)
. Why is that?
Obviously a hack... but a way of squaring a number without using the *
operator (this was a coding contest requirement).
(&a)[n]
is equivalent to a pointer to int
at location
(a + sizeof(a[n])*n)
and thus the entire expression is
(&a)[n] -a
= (a + sizeof(a[n])*n -a) /sizeof(int)
= sizeof(a[n])*n / sizeof(int)
= sizeof(int) * n * n / sizeof(int)
= n * n