数値の二乗を計算する関数を見つけました:
int p(int n) {
int a[n]; //works on C99 and above
return (&a)[n] - a;
}
これは n 2の値を返します。問題は、それがどのように行われるかです。少しテストした後、(&a)[k]
との間が/(&a)[k+1]
であることがわかりました。なぜでしょうか。sizeof(a)
sizeof(int)
ベストアンサー1
明らかにハックですが、演算子を使用せずに数値を二乗する方法です*
(これはコーディング コンテストの要件でした)。
(&a)[n]
int
位置へのポインタと同等である
(a + sizeof(a[n])*n)
そして全体の表現は
(&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