Twitterで「三項演算子」がトレンド入り 193
ストーリー by hylom
便利なんだけど難しい 部門より
便利なんだけど難しい 部門より
Anonymous Coward曰く、
11月7日の昼頃から夜にかけて、Twitterでなぜかプログラミング言語の「三項演算子」がトレンド入りしていたようである(まとめまとめ、Twitterトレンド速報)。
発端となったTweetもいまいち不明で、なぜ今更「三項演算子」が話題なのか、多くの人が首を傾げているようだ。プログラマーのTwitter率の高さと、みんなの三項演算子に対する想いの強さを伺わせる。スラド読者諸氏も三項演算子への想いを語っていただきたい。
発端? (スコア:3, 参考になる)
きっかけはこのおもしろい(オブラートに包んだ表現)ツイートではないかな
https://twitter.com/fnya/status/1192036095820615680 [twitter.com]
Re:発端? (スコア:5, おもしろおかしい)
>
>(条件式) ? true : false
>
>って書くよね?
>
>レビューで条件式だけで動作するとしつこく詰め寄られたけど、可読性が落ちると突っぱねた。
その理屈が成り立つなら
(条件式 ? true : false ) ? true ? true : false : false ? true : false
て書けばさらに3倍くらい可読性が上がるのでは?
Re:発端? (スコア:1)
(条件式 ? true : false ) ? true ? true : false : false ? true : false
て書けばさらに3倍くらい可読性が上がるのでは?
殺意しか上がりません……!
Re:発端? (スコア:1)
なんかすごい煽られてる気がする。
true? trueなの? false? false? ねえtrueなのfalseなのどっち?
みたいな。
Re:発端? (スコア:1)
そこまで行くと、逆になんか、こう……引いちゃう?
Re:発端? (スコア:1)
普通は、三項演算子を入れ子で使うの禁止というコーディングルールがあると思いますが。
私は、入れ子にしない限りは可読性は悪くなく、コンパイルで最適化されるので速度も落ちないので、(条件式) ? true : false は良いと思います。
Re:発端? (スコア:1)
三項演算子の三項目に別の三項演算子を突っ込むのはそれほど見づらくないのでよく書くな。
return 第1条件 ? a :
第2条件 ? b :
第3条件 ? c : d;
みたいな?
switch caseに二項演算子が使える言語だとそっちで書くことも考えるけど、caseの間に代入とかreturnとかが並んでるのはスマートじゃないと思ったり。
入れ子禁止ルールは見たことないけど、そういう職場のあるのね。
Re:発端? (スコア:1)
C言語で条件の部分が数値にしか見えない場合は可読性が多少上がるかもしれない。
ブール型の扱いが厳密な言語なら可読性があるように書かないとコンパイルエラーになるから、そういう言語しか使ってなければおかしく見えるかもね。
Re:発端? (スコア:1)
C99を知らない人にはピンと来ないかもしれませんね
Re:発端? (スコア:1)
そういうことではなくて、ブール型を厳密に扱う言語のブール型を返す関数で「return 1+2*3/4」は真を返すことにならず、コンパイルエラーになるってこと。
Re:発端? (スコア:1)
そういう言語ではreturn (1+2*3/4) != 0というような真偽値を表す式であることが一目でわかる(==可読性が高い)ように書かないとコンパイルエラーになるということです。
Re:発端? (スコア:1)
三項演算子をわざわざ使えばおかしく感じられる言語の方に突っ込みを入れていれば、三項演算子に関係ない回答になるのはしようがないです。
Re:発端? (スコア:1)
三項演算子の可読性や是非以前に、可読性の低い日本語しか書けないようなエンジニアが駄目な実例ですな。
かわりに英語が堪能ならいいけど、だったら英語の/.いけと。
Re:発端? (スコア:1)
それについては元コメに対して直接コメントしたらよいのではないでしょうか。
わざわざ私のコメントにつけたら私のコメントに対する話だと考えてしまうので。
Re:発端? (スコア:1)
私のコメントはC言語で条件式が数値の場合ならまだありかもね。という話なので、
1. return 1+2*3/4
or
2. return (1+2*3/4) != 0
or
3. return (1+2*3/4) ? true : false
ということになります。これなら趣味の問題かなと。
Re:発端? (スコア:1)
いや解ってないですが。
というか、そのコメント自体何の根拠もないわけで。もしかして、Anonymous Cowardは意識の集合体なので、誰が書いてようが考えていることは同じとかいうネタですかね。
Re:発端? (スコア:1)
IDEを使うかどうかが何か関係するのか、誰がコンパイルが通らない状態で放置したのか、どんな腐った環境の話をしてるのか等は私も分かりかねます。
Re:発端? (スコア:1)
何の話をしているのかがよくわかりません。コメントの付け先をお間違えではないでしょうか。
Re:発端? (スコア:1)
Excelの=if()が恥ずかしげに顔を出します
# もうすぐ冬ですね
-- う~ん、バッドノウハウ?
Re:発端? (スコア:1)
// オランダ人というと飛んだりさまよったりするほう
Re: (スコア:0)
return (条件)? true : false; なんて書くくらいなら return 条件; だよなあ
そりゃレビューで落とすでしょ感
Re: (スコア:0)
それを可読性が落ちると言ってつっぱねたというのがすごい。
? true : false
がついている方が読みにくいと超個人的には思うけどね。
Re: (スコア:0)
俺も、ゴミつけたら読み難いとしか思えないが、読み易い読み難いってのは個人の感性というか感想だから仕方ないのだろう。
とはいえ自分に都合がよいからといって、一般的でないことやって読み難いから止めろと言われても、つっぱねるってのは、エンジニアを仕事にするの向いてないというか、チームに存在するだけで迷惑な奴ってことだから仕事変えて趣味だけに留めるべきだろうな。
https://twitter.com/fnya/status/1192039284821250048 [twitter.com]
別ツイートで、こんなことも言ってるから、つまみぐい的にプログラム書いてきて、そもそものプログラムへの理解が乏しいようだから、自分の能力不足を改善せずに目先の問題回避してきた結果、そうしないと困ってるのかもね。
そのあたりも思考方向がエンジニア向きじゃなさそう。
Re:発端? (スコア:2, 参考になる)
TokusiN @toku51n 11月6日
返信先: @fnyaさん
trueとの比較は危険なのでやってはいけない。もしどうしてもbool型との比較が必要なのであれば!=falseにしなければいけない。
1件の返信 2件のリツイート 10 いいね
fnya@Web/Mobileアプリ構築中 @fnya 11月6日
危険というのは、PHPやJavaScriptでオブジェクトがtrue判定されることですか?
1件の返信 0件のリツイート 0 いいね
TokusiN @toku51n 11月6日
いえ、trueと評価されるべきものがfalse判定されることがあります。
1件の返信 0件のリツイート 3 いいね
fnya@Web/Mobileアプリ構築中 @fnya11月6日
?!
1件の返信 0件のリツイート 0 いいね
?!じゃねえよ。頭が正常系でできてんのか?
Re:発端? (スコア:1)
これ重要な指摘かと。
プログラマたるもの鼻から悪魔を出させるようなことはしたくないにちがいないのですが、だいたいの処理系の鼻には悪魔がたくさん住み着いているので。
Re: (スコア:0)
if ( (a == b) == true )
みたいなのはコード引き取ると良くある…
Re:発端? (スコア:1)
if (!Foo()) { ... }
って書きたいけど、「!」の視認性が悪いから、
if (Foo() == false) { ... }
としてるんだという意見に対して、
if (!!!Foo()) { ... }
のように奇数個の「!」を気の済むまで書けばいいじゃんていう話好き
# そして間違って偶数個の!を書いてしまうまでがブック
Re: (スコア:0)
return ok ? true : false;
なら俺でも怒るが
return b*b-4*a*c >= 0 ? true : false;
なら怒らない
Re:発端? (スコア:1)
return (f(x)!=0);
みたいに書けばいいと思う。
Re:発端? (スコア:1)
C99で導入されたbool(_Bool)では、false/trueはintなので、結局三項演算子を使ってtrue/falseにしても、_Boolへの暗黙の型変換は行われてしいますよ。
一方、C++で導入されたboolの場合は、比較演算子はbool型を返すので、三項演算子を使わなくても暗黙の型変換は行われない
結局、C99でもC++でも、「cond ? true : false」したからといって型の取り扱いは何も変わらない。
それに、暗黙の型変換がいやだというなら、明示的に型キャストすればいいだけ。
そこで三項演算子を使うのは「言語処理系が提供する型キャスト機能があるのに、同等のコードを手で書く」という車輪の再発明で、無駄にバグの元になりかねない。
Re:発端? (スコア:1)
C99では、
_Bool型が新たに作られた。0と1しか値をとらない、intとは別の型
stdbool.hで、bool は _Boolと定義されている。
stdbool.hで、true/falseは、1/0と定義されている。int型の定数。
なので、「bool a = true;」とかやっても、intから_Boolへの暗黙の型変換が行われる、という話ですよ。
Re:発端? (スコア:1)
C99では、先に「比較演算子は、真なら1、偽なら0になる」という仕様があって、それにあわせて、後からtrueとfalseが定義されている(だから、true/falseは_Bool型ではなく、int型の定数になってる)。
だから、言語仕様上、比較演算子がtrueかfalseを返すのは明白。「a > b ? true : false」みたいに、「trueかfalseな値」を元に「trueかfalseに仕分ける」のは無駄でしかない。そうしないと「不安が残」るようでは、C言語への理解が浅いだけでしょう。
「a+b ? true : false」みたいなコードなら、「明示的にbool化する」という意図は分からないでもない。でも、このコードは車輪の再発明。「(bool)(a+b)」の方が意図が明確。
単項、二項、サンコーン! (スコア:2)
Twitterしってる ? トレンドきづいた ? 俺も俺もー : ちゃんとトレンドみろよ : あばよ
getchar/putcharマクロ (スコア:1)
4項演算子 (スコア:0)
見た気がする。
Re:4項演算子 (スコア:2)
FORTRANは
条件が
0未満
0
0を越える
という分岐がありまして。
Re:4項演算子 (スコア:1)
あたい知ってるよ (スコア:0)
デレステの新しいキャラだよね?
考えさせたら負け (スコア:0)
コードに可読性をもたせるってのは、読み手になるたけ考えさせないことを目的とする
解釈が必要なんてのは最悪
ってばっちゃが言ってた
# ロジックの必要性からならコメントで補う
Re:考えさせたら負け (スコア:2)
おっしゃる通りなので、ここはこう書くべきでは。
# コードに可読性をもたせるってのは、読み手になるたけ考えさせないことを目的とする
# 解釈が必要なんてのは最悪
## ってばっちゃが言ってた
ロジックの必要性からならコメントで補う
Re: (スコア:0)
というのが問題なんだと思う。
真偽値型を使うときは常にtrueとかfalseとか即値で書きたくなるのも
変数名には型を表す接頭辞をつけたくなるのも
全部これが原因。
PowerShell 7 Preview 4 (スコア:0)
PowerShell 7 Preview 4でサポートされて、
賛否両論を呼んでじわじわと広がってきたのではないでしょうか?
条件演算子 (スコア:0)
通称三項演算子だけど、三項演算子というカテゴリの「条件演算子」が正しい。
のだと思ってるけどどうだろう。(弱気)
Re:条件演算子 (スコア:2)
わかる。
三項演算子が一つしかないから、そういういいかげんな呼び方が許されてるだけ。
だから、ほかの三項演算子を発明するべき!
でも、どういうのがあり得るかな?
だいたいは二項演算子の組み合わせですんじゃうし。
逆に、条件演算子の「:」以降をオプションにするとか?
仕事では使わない。 (スコア:0)
そもそも、三項演算子を知らない人が結構いる。
Re:仕事では使わない。 (スコア:1)
三項になる
Re:使ってはいけないものの代名詞 (スコア:1)
それは、false節だけが入れ子だからできるテクニックであって
Re:使ってはいけないものの代名詞 (スコア:2)
じゃあ、true節とfalse説を入れ換えれば。
Re:使ってはいけないものの代名詞 (スコア:1)
「false部がネストしてもかまわない」でいいんじゃないの。
if-else ifだって、まじめに構文解析の構造を見ると、
と、elseでどんどんネストが深くなる構造してる。
でも、
と書けば、理路整然とelse if が並立しているように見えて、可読性も良い。
同じように、三項演算子も#3713292 [srad.jp]の書き方は許可、でいいと思う。
Re:Swift初心者 (スコア:1)
三項演算子じゃないけど別パターン…
if !optional!.bool {
// 何か
}
※こっちは!の連続でぱっと見わけがわからない