条件演算子単語


ニコニコ動画で条件演算子の動画を見に行く
ジョウケンエンザンシ
2.5千文字の記事
  • 2
  • 0pt
掲示板へ

条件演算子(conditonal operator)とは、条件によって違う値を返すための演算子である。三項演算子(ternary operator)とも言う。

概要

演算子とは"1 + 2"でいえば"+"のことである。この場合、オペランド(: operand. 被演算数。左記の"1", "2"のこと)が2つなので二項演算子(binary operator)に分類される。

条件演算子は、「条件」「式(条件がの時の値)」「偽式(条件が偽の時の値)」をオペランドにとり、条件(の計算結果)がの時は、式を評価(計算)した結果を返し、条件が偽の時は、偽式を評価した結果を返す演算子である。

オペランドが3つなので三項演算子ということになる。ちなみに、"i++"のようにして使うインクリメント"++"や、"-a"のように数値の正負を反転させる"-"はオペランドが1つなので単項演算子(unary operator)という分類になる。

条件演算子を採用している代表的なプログラミング言語であるC言語Javaなどでは、

 条件 ? 式 : 偽式

という形をとる。

"+"や"="などと異なり、プログラミングでしか出てこない記号なので、使うとプログラミングをしているという実感が湧き厨二心がくすぐられる。

サンプルコード

歴史的なことを考えるならC言語の例をあげるべきかもしれないが、編集者の都合によりJavaのサンプルを掲載する。サンプルコード全文はこちら

        n = random.nextInt(2);
System.out.println(n == 0 ? "丁" : "半");

if文ではSystem.out.println()を2回書いているが、条件演算子を用いるとSystem.out.println()を1回書くだけで済んでいる。

三項演算子という名称について

条件演算子を最初に普及させたC言語において、条件演算子は一の三項演算子であったため、条件演算子のことを三項演算子と呼ぶことも多い。三項演算子という、聞いただけでは機を想像できない名前もまた厨二心をくすぐるのである。

その後の歴史のおいても条件演算子以上に汎用性の高い三項演算子が普及することはなかったため、三項演算子と言えば条件演算子をす状況は継続している。

短絡評価

関数引数はすべて関数に渡される前に評価されるが、条件演算子のオペランドの式・偽式は条件に合致した方しか評価されない。

たとえば、条件に合致せず評価されなかった方にプログラムハンアップするようなコードが入っていても動作には何のもない。

この性質は短絡評価と呼ばれ、他にはand, orなどの論理演算に見られる。一種の遅延評価と見ることもできる。

分岐フロー制御に使える?

プログラミング言語で条件分岐フローを実現するには基本的にif文を用いる。しかし条件演算子の使えるプログラミング言語では、条件演算子の値を返すという性質を無視して、if文を用いた分岐フロー制御の代わりに条件演算子を使用できなくもない。

言語設計者の裏をかいたような気分になって厨二心をくすぐられるかもしれないが、良い子は真似をしてはいけない。ワンライナーとかをしているのでなければ、フロー制御に if が使える言語では素直に if を使うべきである。

可読性の問題

条件演算子は使うとかっこよくなった気分にひたれるのだが、見慣れない記号であること (や、改行を入れて使用することが想定されていないこと)から、可読性が悪くなると言われている。概要のサンプルコードのような自然に1行におさまる単純な例ではむしろ可読性が上がるのだが、特にオペランドの式が長くなったときや、条件演算子をネスト(入れ子に)した場合には可読性の悪化が顕著に表面化する。

可読性のために組織内のコーディング規約で条件演算子のネストを禁止したり、使用を制限したりする場合もある。

条件分岐といえばFizzBuzzコード全文はこちら

    /** 条件演算子をネストした例. */
private static String ternaryFizzBuzz(int input) {
return input % 15 == 0 ? "FizzBuzz" : (input % 5 == 0) ? "Buzz" : (input % 3 == 0) ? "Fizz" : Integer.toString(input);
}

各言語の条件演算

上記可読性の問題を意識してか、同様のことを実現するのに演算子(記号)ではなく式(expression)という形を取る言語もある。

C言語, Java, Ruby

概要で述べた通り、以下の書式である。

 条件 ? 式 : 偽式

Scala, Kotlin

ScalaKotlinでは、「if文」ではなく値を返す「if式」とすることで、分岐フロー制御と条件演算子の機を一本化した。

if (条件) {式} else {偽式}

Python

Pythonソースコード可読性の高さを売りにしているため、条件演算子の導入が長い間見送られてきた。バージョン2.5からようやく導入されたが、演算子ではなく「条件式 (Conditional Expressions)」exitという「式」になっている。

他言語の条件演算とは、「条件」の位置が異なっている。

if 条件 else 偽式

Python3のサンプルコードはこちらPythonif文では改行が必須だが条件式を使えば1行で記述できる。

LISP

LISPでは、ifフロー制御をするとともに、値を返す条件演算子の機も兼ねている(短絡評価があるので関数ではない)。そういう意味ではScalaKotlinは先祖返りしたとも言える。if でなく cond(ition) を先に定義する場合もあるが、ここでは触れない。

(if 条件 式 偽式)

関連動画

関連リンク

関連項目

でニコニコ動を検

【スポンサーリンク】

  • 2
  • 0pt
記事編集 編集履歴を閲覧

この記事の掲示板に最近描かれたお絵カキコ

お絵カキコがありません

この記事の掲示板に最近投稿されたピコカキコ

ピコカキコがありません

条件演算子

9 ななしのよっしん
2019/11/09(土) 12:23:31 ID: 55Pa5n6o+z
3項演算子って呼ばれてる割に
見た上は2項演算子を2つ並べてるだけなのが気になる
内部処理の兼ね合いでこんな名前がついたんだろうけど
👍
高評価
0
👎
低評価
0
10 ななしのよっしん
2019/11/09(土) 19:03:34 ID: 4zizFdO6X3
>>4
ありがとうございました
>>9
カリー化の考え方を応用すれば、何項演算でも二項演算の組み合わせに帰着できるので、その感覚は間違いではないです。
👍
高評価
0
👎
低評価
0
11 ななしのよっしん
2019/11/15(金) 20:48:30 ID: JHV0vmDMxp
三項演算子」を「三浦理恵子」に空目した。
👍
高評価
0
👎
低評価
0
12 ななしのよっしん
2020/04/10(金) 19:29:52 ID: MdynaZClwU
LISPでは、ifフロー制御をするとともに、値を返す条件演算子の機も兼ねている(短絡評価があるので関数ではないと思う)。
このいかがでしたか?みたいな中途半端な説明は何やねんw 分からないなら書くなよw
Lisp的にはそもそも演算子という概念自体があんまりフィットしないんだが、Common LispだとOperator関数マクロSpecial Formのどれかで、ifSpecial Formという分類。SchemeだったらProcedure callの識別子がoperatorで、Procedure callif、その他ひっくるめてexpresionという扱い。
だから強いて言うならif式で、いずれにしても当然関数ではない。
👍
高評価
0
👎
低評価
0
13 ななしのよっしん
2020/04/11(土) 06:13:12 ID: 4zizFdO6X3
>>12
情報提供ありがとうございました
摘の表現手法につきましてはニコニコ大百科:編集者向けのページの「ニコニコ大百科演説をする場所でもあります」などもご参照の上、温かいで見守って下さいますようお願い申し上げます。
👍
高評価
0
👎
低評価
0
14 ななしのよっしん
2020/04/11(土) 13:17:09 ID: MdynaZClwU
一つだけ。
ニコ百において主観の入った意見を自由にかける点には100%同意する
けど定義がきちんと決まっていて調べればちゃんと分かるただの事実を「には分からないから適当に書きます」というのを演説だと思っているならぼくは君を軽蔑する。
だってそれは個人の泣き言であって意見じゃないだろう。内容が間違っていることに文句をいいたいわけじゃない(それは直せばいい)。やる気のない文章を書く言い訳にするなといってるわけね。
👍
高評価
0
👎
低評価
0
15 ななしのよっしん
2020/04/11(土) 15:02:09 ID: 4zizFdO6X3
>>14
演説かどうかは不明ですが、客観的正確性が保されない主観の混じった情報といった位置づけかと。

実際のところ、摘された記事の文脈における「関数」が、LISP関数なのかプログラミング言語全体における関数概念の総称のようなものかによって、調べることで確定できるかも変わってきますから。>>12には対応させていただきましたが、どちらかというと後者の意味の関数として書いたので、>>12摘自体も適切とは限らないですし。
👍
高評価
0
👎
低評価
0
16 ななしのよっしん
2020/04/11(土) 15:05:27 ID: FVkn0OG6BS
条件演算子定義とかいうこの世でもっともどうでもいいことの一つで争い合う君たちを尊敬するよ
👍
高評価
0
👎
低評価
0
17 ななしのよっしん
2020/04/11(土) 15:12:03 ID: K2izcOIzxF
圏論的には機から分類するべきで名前の付け方にはあんまり意味がないし名前と機が一致してなかったり想定される機が言語でバラバラだったりあるべき機実装されてなかったり
そういうのにこだわるほど言語の機の説明にではなく言語そのものに文句が出るものだろうと思う
👍
高評価
0
👎
低評価
0
18 ななしのよっしん
2020/04/11(土) 15:13:54 ID: K2izcOIzxF
「だからこの言語ではそうだ(だから発言を取り消せ)」という批判をしてもそちらではそうなんですかという答えしか出ないと思う
👍
高評価
0
👎
低評価
0

ニコニコニューストピックス