加藤@ODNです.

In article <d0tn3a$lvr$1@ns.src.ricoh.co.jp>, Junn Ohta wrote:
>fj.comp.lang.cの記事<42320110.7079%katoh@pop12.odn.ne.jp>で
>    katoh@pop12.odn.ne.jpさんは書きました。
>> いえ,「そもそも」というのは,歴史的なものではなく,演算子の機能の意味で
>> す.「+は二つの値の加算のためのものである」というのと同じ意味で,3項演
>> 算子は「条件式の真偽に応じて値を変える」ためのものである,と言うことで
>> す.
>
>なるほどです。
>
>でもフローは変えなくても、条件によって実行される箇
>所とされない箇所があるという意味でふつうの演算子と
>違うところがありますよね。

「実行される箇所」というのは(機械語ではなく)ソース上の(字面の)話です
ね?

>というわけで、私は「副作用のあるなしを制御」という
>のが三項演算子の目的のひとつとしてあっただろう、そ
>れはかなり重要なものだっただろうと思います。&&や||
>と同じような意味で、ということですね。

こういうのを副作用と呼ぶかには,かなり疑問がありますが...それはともか
く,,,

&& や || は,一方の値に依っては,残りを計算しなくても全体の値が決まると
いう,その演算の(ある意味特殊な)性質を利用しているので,?: 演算子とは
若干性質が異なるように思えます.例えば,& や | の仲間の ^ (exclusive or) 
にはこれは適用できません.また,乗算でも,第一項がゼロだったら残りを計算
せずに結果をゼロにするというのも考えられます(Cで許されたっけ?).&& や
 || は,概念的にはこれと同類だと思います.

もちろん,?: に後ろの二項とも評価するように操作的な意味を与える事は可能
で,それをしなかったのは何故か,という話なら,Cの場合は,実行速度最優先
で設計したから,ということだと思います.なら & や | は不要じゃないか,と
いう意見があるかも知れませんが,これらは論理演算子であると同時にマスク操
作命令としての用途がありますから,省くことはできません.

ややこしくなったのでまとめると,
似た点: 両オペランドを計算しなくても値が求まる(場合がある &&, ||).
違う点: ?: は常に一方だけで良いが,&&, || は場合に依る.
かな? なんか重複してるような気が...

蛇足ですが,Lisp で and や or を cond の代わりに使うのは,私は,邪道(あ
るいは,トリッキーで真っ当なプログラマーはやるべきではないこと)だと思い
ます.
#GNUS に and, or を使った複雑な制御構造があってバグってたのは内緒.
-- 
Hideki Kato <mailto:katoh@pop12.odn.ne.jp>