n項演算

プログラム言語によっては三項演算子というものが実装されています。三項演算子は、ある条件Pが真ならばAの値を、偽ならばBの値を返す演算子で、P,A,Bの3つのオペランド(被演算項)が出てくるので三項演算子と呼ばれます。例えばJavaでは P?A:B のようになります。

なでしこではブーリアン(真偽値)型が実装されておらず、代わりに整数の0がFalseとして、1がTrueとして扱われます。つまり、真偽判定をする命令の返り値が真(=1)か偽(=0)で返ってきます。それを利用すれば、なでしこでも三項演算のようなものができます。それどころか、いくらでもPやAやBの値を増やせるので、n項演算ができるのです。

たとえば、最大・最小の値を求めるのにこの手法が使えます。下のサンプルをみてください。

最大・最小をn項演算で求める
A=100
B=50
MAX=A*(A>B)+B*(A≦B) # 100*1+50*0
MIN=A*(A<B)+B*(A≧B) # 100*0+50*1
 

こんな風に、条件式A<Bなどが0または1という整数の値を返すことを利用して、もし文を使わずに計算だけで最大や最小を得ることができます。ただし、3つ以上の値の場合は配列最大・最小値命令を使った方がいいでしょう。

  • 式がコンパクトである
  • もし文が短くなってソース全体の見通しがよくなることがある
  • ケースバイケースだが、実行速度や理解のしやすさは多少犠牲にもなる

上の例ではすごく速くなるとか言うわけでもなし、あまり有難みがありませんね。僕の場合はこういうソースも読み慣れてきているので、よく使ってしまいますが、まぁ知っていなければいけない知識ではありませんね。結論、普通は「もし」文を使えばよい。あくまでTipsとしてどうぞ。

n項演算使って便利な例があればさらにプログラム例を追加します。