- ベストアンサー
先行評価と遅延評価
...................................................... f(a, b/a); ...................................................... function(x,y){ ........................................................ if(x!=0) z=y; ...................................................... } このようなプログラムで ・先行評価: C言語の様に引く数を実際に使う前に前もって計算しておく方式 ・遅延評価: 関数本体の中で実際に対応する仮引数の値が必要になった時に計算する方式 ”この時aがゼロとすると、先行評価を採用する場合、b/aを計算するので誤りが発生する。遅延評価を採用してる場合は、aがゼロと言う事でyすなわちb/aは利用されないので、誤りは起きない” とある本にありましたが、 >この時aがゼロとすると、先行評価を採用する場合、b/aを計算するので誤りが発生する。 とはどういう事なのでしょうか!! C言語では、別に誤りは発生しないと思うのですが、宜しくねがいます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#3さんが書かれている通り、除数が0の場合の動作は未定義です。 何らかの値(決まった値かもしれないし、不定値かもしれない)を返すこともあれば、シグナルが発生することもあります。言語規格外の例外が発生する処理系もあるわけです。整数は何らかの値を返すけれども、浮動小数点数の場合はSIGFPEシグナルが発生するということもあるでしょう。 誤りというのが何を意図しているのか分かりませんが、例えば、 double a = 1.0, b = 0.0; のとき、a/bがINFINITYになれば、それが誤りなのかどうかは何ともいえないところですね。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
除数が 0 のときは undefined behavior なので, 「例外が発生する」かもしれませんし「何もなく通りすぎる」かもしれません>#2.
- sakusakerZ
- ベストアンサー率25% (1/4)
質問にある“誤り”というのがゼロ割による例外だとすると、Cでは#1の方の 回答にある通り例外が発生してしまいます。 遅延評価を採用した言語(処理系)の場合、ゼロ割の発生源であるb/a が f(x!=0) z=y; ということなのでで、aが0のときには行われません (遅延評価なので、yを使うとわかって初めて b/aを実行するが、ifの 条件によりaが0のときにはyは使われない)。 Cの場合は関数を呼び出す前準備の段階で必ず b/aを実行するのでゼロ割が 行われてしまうというわけです。 >先行評価: C言語の様に引く数を実際に使う前に前もって計算しておく方式 たぶん入力ミスだと思いますが引数 は “ひきすう”です。 #ひきすうでは辞書登録されてないか?
- machongola
- ベストアンサー率60% (434/720)
こんにちは。 試してみました。 ハンドルされていない例外はxxx.exeにあります Integer Divide by Zero ↑これのことでしょうか?
お礼
いつも適切なご回答ありがとうございます。