7

は、我々は、すべての短絡乗算のようなものはありますか?

if (False AND myFunc(a)) then 
... 

if条件が真であることができる方法はありませんので、myFunc()を実行する気にしない、すなわち、論理式には約短絡を、知っています。

私はあなたの毎日の代数方程式の等価があるかどうかについての興味があった最初の項を評価するにはポイントがないC=0場合、

result = C*x/y + z 

を言います。 xyがスカラーであったとしてもパフォーマンスはあまり重要ではありませんが、私たちが大きい行列であり、操作がコストがかかり(行列にも適用可能です)、確かに違いがあります。もちろん、if C!=0ステートメントを投げることで、このような極端なケースを避けることができます。

私の質問は、そのような機能が存在し、有用かどうかということです。私はあまりプログラマーではないので、おそらく私が出会ったことのないいくつかの名前の下にあります。もし私に教えてください:)

+1

論理短絡が機能の観点から重要な概念であります機能的な違いがないコンパイラレベルでの最適化です。気づかないうちに選択した言語がすでに舞台裏でやっているかもしれません。 – deceze

+2

私よりもよく知っている人は答えなければならないが、もしあなたが部門を短絡させるならば、あなたが問題に遭うと思うだろう。たとえば、y = 0の場合はどうなりますか?短絡した場合は、答えが実際にエラーであるときに0を返します。 – Nate

+0

@deceze論理的な短絡と同じように、算術的な短絡は実際には最適化を超えた機能的な違いがあります。 'result = C * myfunction()'を考えてみましょう。算術式を短絡させる 'C == 0'の場合、' myfunction'は決して呼び出されません。副作用が発生していなくても(論理的な短絡の場合と同様に)、 –

答えて

6

遅延評価非厳密な評価、必要によって呼び出し、いくつかの名前にすると、実際にははるかに強力なちょうどここ乗算を回避し、よりそこ。

HaskellまたはFregeなどの評価モデルが非厳密なプログラミング言語があります。そこには、あなたの「短絡」は乗算演算子を書くことは非常に簡単になり、たとえば次のようなものを書くことができます:「算術短絡が」ながら

infixl 7 `*?`  -- tell compiler that ?* is a left associative infix operator 
        -- with precedence 7 (like the normal *) 

0 *? x = 0   -- do not evaluate x 
y *? x = y * x  -- fall back to standard multiplication 
+0

ありがとう!フォローアップの質問にも答えるために受け入れられました。 – Verge

1

データが大きくて複雑で操作が高価な場合、操作の実装は高価な操作を行う前に適切なショートカットチェックを実行する必要があります。これは演算子の実装の内部的な詳細です(例えばmatrix *)が、実際には "multiply"という言語概念とは関係がなく、計算の記述方法にはほとんど影響しません。

あなたが話している概念は別の名前の下に行く
関連する問題