>>360
>>359 の言うような最適化をするかどうかは知らんけど...

> absがグローバル変数を触らないってことが,どうしてコンパイラにわかる?

わかる (と言うか教えている) 処理系あるよ。

例えば、VC++ 6.0 だと...

/Oi オプションを指定すると、次の関数が組み込み (インライン) 形式に置き換えられます。
_disable(), _outp(), abs(), memset(), _enable(), _outpw(), fabs(), strcat(), _inp(), _rotl(), labs(), strcmp(), _inpw(), _rotr(), memcp(), strcpy(), _lrotl(), _strset(), memcpy(), strlen(), _lrotr()

となってる。当然コンパイラは、関数の挙動は知ってるわけ。

また、GCC なんかでは拡張機能で、

int abs(int) __attribute__ ((const));

と宣言しておけば、abs() の引数が同じなら、返り値が変わらないことをコンパイラに教えることができる。

> 煽りじゃなく無知ゆえの疑問です。

そう言う疑問を持つことはいいことだ。

>>361
普通に、return a >= 0 ? a : -a; の方が早いと思うぞ。
また、>>361 は環境に依存してるしね。