intからlongへの変換(C言語)?
ちょっとショックなコードを見たのでそのことを書きます。
long itol(int n) { char buffer[64]; sprintf(buffer, "%d", n); return atol(buffer); }
どういう動機があってこんな関数を書いたのか、使い所(デッドコードじゃなかったんです)をどうやって決めたか分かりません。
みると、そばにこんな関数もありました。
int ltoi(long n) { char buffer[64]; sprintf(buffer, "%ld", n); return atoi(buffer); }
どうも、intとlongのサイズが違う環境に移植するときに、とにかくコンパイル警告だけでないようにしちゃった感じです。で、ltoiを書いたついでにitolってのも書いたんでしょうか。
それならと僕も別の実装を考えてみました。
long itol(int n) { return n == 0 ? 0L : 0 < n ? itol(n - 1) + 1L : itol(n + 1) - 1L; }
最適化かければいけると思うんですよね。もちろんスラッシングは解決しないですけどね…