Re: 三項演算子(Re:こんなコード書く?)
加藤@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>
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735