アカウント名:
パスワード:
ゼロ除算の結果は未定義だから、例外投げて死のうが何らかのデフォルト値を返そうがコンピューターが爆発しようが任意コードが実行されようが鼻から悪魔が出ようが仕様上は何の問題もない。チェックが不要になるわけではないが。むしろ例外が投げられると期待してチェックをサボってはいけない(実際にx86に慣れたプログラマーがARMデバイスでよく踏む罠)。
未定義なら定義する方法が提供されていれば解決するのかな。
仕様上未定義ということは、コンパイラを実装する人が決めていいってことですよ。
仕様上で定義するには、C規格を改訂すればいいのです。
C言語の思想的に、そういう最適化の足かせになるような改訂を受理することはまずないと思うけどね。ゼロ除算が仕様上未定義だから、コンパイラは除数がゼロになることは絶対にないと決めつけて最適化を行うことができる。同様に配列の範囲外へアクセスしたときの結果が未定義だから、境界チェックを省略できる。
C99とか見てると、未定義動作はなるべく減らしたいなぁという意志が感じられなくもないですけどね。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
身近な人の偉大さは半減する -- あるアレゲ人
C言語なら (スコア:1)
ゼロ除算の結果は未定義だから、例外投げて死のうが何らかのデフォルト値を返そうがコンピューターが爆発しようが任意コードが実行されようが鼻から悪魔が出ようが仕様上は何の問題もない。チェックが不要になるわけではないが。むしろ例外が投げられると期待してチェックをサボってはいけない(実際にx86に慣れたプログラマーがARMデバイスでよく踏む罠)。
Re:C言語なら (スコア:0)
未定義なら定義する方法が提供されていれば解決するのかな。
Re: (スコア:0)
仕様上未定義ということは、コンパイラを実装する人が
決めていいってことですよ。
仕様上で定義するには、C規格を改訂すればいいのです。
Re: (スコア:0)
C言語の思想的に、そういう最適化の足かせになるような改訂を受理することはまずないと思うけどね。ゼロ除算が仕様上未定義だから、コンパイラは除数がゼロになることは絶対にないと決めつけて最適化を行うことができる。同様に配列の範囲外へアクセスしたときの結果が未定義だから、境界チェックを省略できる。
Re: (スコア:0)
C99とか見てると、未定義動作はなるべく減らしたいなぁという意志が感じられなくもないですけどね。