質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

5回答

1589閲覧

三項演算子の使い方

Redhat

総合スコア11

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2015/08/09 08:59

プログラミングを始めて半年にも満たない初心者です。

lang=javascript

1function Sum(N) { 2 r = 0 3 if(N < 1) 4 for(; N < 2; N++)r += N 5 else 6 for(; N > 0; N--)r += N 7 return r 8}

という、指定したNから1までの合計を出力するような関数を書きました。

現在は独学で勉強中なのですが、これを出来るだけ短くするためにはどうしたらいいのか調べると三項演算子というやり方があると解りました。
これをさらに簡潔に書くのに三項演算子は活用できるでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

JavaScript

1function sum(n) { 2 var r = 1; 3 while (n != 1) r += n < 1 ? n++ : n--; 4 return r; 5}

三項演算子を使った一例です。

三項演算子は無理に使おうとすると、可読性が著しく損なわれます。
上記のコードも可読性があるとはお世辞にも言えませんし・・・

投稿2015/08/09 11:05

shiolier

総合スコア1156

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Redhat

2015/08/09 11:10

例が解り易かったのでベストアンサーにしました 簡潔に、というよりかは出来るだけ短く、といった要件でしたので、類似する課題にも使えそうですね。
guest

0

三項演算子については賛否あります。
私は場合によっては可だと思います。

たとえば下記のようなコードが例です。
(質問文のソースに近い書式で書いてます)

javascript

1function Sum(N) { 2 r = 0; 3 N < 1 ? r = plus(N) : r = minus(N); 4 return r 5} 6 7function plus(N) { 8 for (; N < 2; N++) r += N; 9 return r 10} 11 12function minus(N) { 13 for (; N > 0; N--) r += N; 14 return r 15}

質問者様からしたら、ご質問の意図とは離れてしまいますし、
元より長くては意味ないと思われるでしょう。

ただ、関数Sumだけに注目してみてください。

javascript

1function Sum(N) { 2 r = 0; 3 N < 1 ? r = plus(N) : r = minus(N); 4 return r 5}

「N < 1が真なら、rはplus(N)、偽ならminus(N)」と一行で読み下せますから、
三項演算子に慣れていれば、可読性は低くないと思います。

このようにコードの短さと可読性は別の概念で、
昔はともかく今は後者を重視すると思います。

長さにしてももし、関数plusらは数行のものが数個で、
Sumが何百行になったときは、全体として短くなります。
また、ネストが浅いほうが分かりやすくなります。

投稿2015/08/09 11:42

LLman

総合スコア5592

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これをさらに簡潔に書くのに三項演算子は活用できるでしょうか?

活用できないでしょうね。

質問のコードを短く出来ても、可読性や保守性はどんどん落ちていきます。

// for文を1つに function Sum1(N) { var r = 0, end = 1, add = N < end? 1: -1; for (; N != end; N+=add) r += N; r+= end; return r; } // さらに短く(改悪) function Sum2(N) { for (var end = 1, r = end, add= N < end? 1: -1; N != end; N+=add) r += N; return r; }

投稿2015/08/09 11:06

horohoro

総合スコア490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

三項演算子は「今では」デメリットこそあれ、何のメリットもない演算子です。

パズルとして「コードを短くしたい」のならかまいませんが、コードを短くするために三項演算子を使うのはオススメしません。

読みにくいコードになるからです。

投稿2015/08/09 10:50

libra55

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Redhat

2015/08/09 11:06

パズルとして使います セミコロンが無いのもその為です
guest

0

既にベストアンサーが出ているようで蛇足ですが、
可読性と拡張性を犠牲にしてとにかく短くしようとしたコードと
(sumをsにすれが4文字減りますがそれはまぁ…)

javascript

1function sum(n){return n==1 ? 0 : n+sum(n<1 ? n+1 : n-1)}

等差数列の公式を持ち出して可読性と拡張性をもっと犠牲にして更に4文字減らしたパターン

javascript

1function sum(n){return (n<1 ? n-n*n : n*n+n-2)/2}

※公式: 等差数列の合計 = 項数 * (初項 + 末項) / 2
※プラス側 : (n-1)(2+n)/2 => (n^2+n-2)/2
※マイナス側: (-1
n)*(-1+n)/2 => (n-n^2)/2

投稿2015/08/09 14:11

hirohiro

総合スコア2068

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hirohiro

2015/08/09 14:28 編集

エラー処理はしていないので、前者は数値以外でエラー、少数を入力すると暴走します。 後者は数値以外の入力でエラー、少数の入力で間違った解答を出すと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問