?:演算子がいいと思った

色んなコード内で見かけてた?:演算子。
なんか難しいことでもやってるんだろうと思ってたけど、使ってみたら何てもこともなく、コードがすっきりして便利だったのでメモ書きとして。

書き方としては「条件式 ? 処理A : 処理B」のように書きますが、使い方はif文と同じで条件式がtrueなら処理Aをfalseなら処理Bをという意味。

例えば最大値が10でそれを超える場合は1に戻るとします。
現在地が8とします、

  1. 10に行きたい場合は2つ進む。
  2. 2に行きたい場合は4つ進む。(12に行きますが10に行くと1へ戻るため)
  3. 6に行きたい場合は8つ進む。

3.の場合、近道したい場合は8つ進むよりかは、2つ戻る(-2進む)方が速いですね。
要は最大値の半分(5)よりも進む距離が長ければ戻った方が楽というわけです。

では、数値を求める式を書いてみることにします。
変数はこんな感じにしておきます。

var max:int = 10; //最大値
var now:int = 8; //現在地
var half:Number = max / 2; //最大値の半分

var tx1:int = 10; //目標値1
var tx2:int = 4; //目標値2
var tx3:int = 6; //目標値3

var dx:int = tx - now; //現在地と目標値との差

(tx1の場合:dx=2、tx2の場合:dx=-6、tx3の場合:dx = -2になる)

ではこれら使いif文で書いてみると

var ax:int; //進む距離

if(dx < 0){
	if(dx > -half){
		ax = dx;
	}else{
		ax = dx + max;
	}
}else {
	if(dx < half) {
		ax = dx;
	}else{
		ax = dx - max;
	}
}
trace(ax);

例えばtx1の場合は、まずはfalse→次はtrueになり、axはdxと同じ+2となる。
tx2の場合は、まずはtrue→次はfalseとなり、axはdx(-6)と最大値(10)を足した+4となる。
tx3の場合は、まずはtrue→次もtrueとなり、axはdxと同じ-2となる。

別にこれでもいいんだけどなんかパッと見てスマートじゃない。
これを?:演算子を使って書き直してみると

var ax:int = (dx < 0) ? (dx > -half) ? dx : dx + max : (dx < half) ? dx : dx - max;

入れ子にも出来るのですっきり一行に収まっちゃいました。
ただ、こちらはパッと見て何をしてるのかわからないので、他人が見ないことを前提にするか、元のif文を残しておくかしておいた方がいいでしょう。

そんなことより、今回例に挙げた式ってもっと楽に書けるんじゃない?って思ったけど、まぁいいとしましょうか。

この記事をブックマーク・シェアする

この記事に関連する記事

カテゴリ

コメント

コメントを残す

コメント*

コメントリンクを nofollow free に設定することも出来ます。

誤字・脱字やリンク切れなどお気づきの点がございましたら@loop0429までよろしくお願いします。

この記事の先頭へ