パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

Twitterで「三項演算子」がトレンド入り」記事へのコメント

  • 発端? (スコア:3, 参考になる)

    by Anonymous Coward

    きっかけはこのおもしろい(オブラートに包んだ表現)ツイートではないかな

    https://twitter.com/fnya/status/1192036095820615680 [twitter.com]

    • by Anonymous Coward

      return (条件)? true : false; なんて書くくらいなら return 条件; だよなあ
      そりゃレビューで落とすでしょ感

      • by Anonymous Coward

        return ok ? true : false;
        なら俺でも怒るが
        return b*b-4*a*c >= 0 ? true : false;
        なら怒らない

        • by Anonymous Coward

          動的型付けだったり、型推論したりの場合は
          return f(x);
          より
          return f(x) ? true : false;
          のことのほうがありがたい場合がある
          とくにf(x)を他人が定義していて、しかもtrueとfalse以外を帰す場合

          • by Anonymous Coward on 2019年11月08日 19時32分 (#3713089)

            とくにf(x)を他人が定義していて、しかもtrueとfalse以外を帰す場合

            return (f(x)!=0);
            みたいに書けばいいと思う。

            親コメント
            • by Anonymous Coward

              Cだと関係演算子の結果はintの値なので、return する関数の型がboolだったりすると暗黙的な型変換が行われることになるので気持ちが悪い。条件演算子を使うかで true か false を返すようした方が良いと思う。

              • by taka2 (14791) on 2019年11月08日 21時50分 (#3713167) ホームページ 日記

                C99で導入されたbool(_Bool)では、false/trueはintなので、結局三項演算子を使ってtrue/falseにしても、_Boolへの暗黙の型変換は行われてしいますよ。
                一方、C++で導入されたboolの場合は、比較演算子はbool型を返すので、三項演算子を使わなくても暗黙の型変換は行われない
                結局、C99でもC++でも、「cond ? true : false」したからといって型の取り扱いは何も変わらない。

                それに、暗黙の型変換がいやだというなら、明示的に型キャストすればいいだけ。
                そこで三項演算子を使うのは「言語処理系が提供する型キャスト機能があるのに、同等のコードを手で書く」という車輪の再発明で、無駄にバグの元になりかねない。

                親コメント
              • by Anonymous Coward

                暗黙的な型変換が行われることになるので気持ちが悪い。

                暗黙的な型変換は全てが気持ちが悪いということでしょうか?
                そうでなければ、なぜ気持ちが悪いか説明が必要だと思いますが。

              • by Anonymous Coward

                C99で導入されたbool(_Bool)では、false/trueはintなので、

                仕様としては stdbool.h に定義されてるのは論理型 bool と論理値 true と false だからそれを使うべきだよ。

              • by Anonymous Coward

                暗黙の型変換がいやだというなら、明示的に型キャストすればいいだけ。

                キャストの危険性認識してない奴がなんか言ってらぁw

              • by taka2 (14791) on 2019年11月08日 23時17分 (#3713226) ホームページ 日記

                C99では、
                _Bool型が新たに作られた。0と1しか値をとらない、intとは別の型
                stdbool.hで、bool は _Boolと定義されている。
                stdbool.hで、true/falseは、1/0と定義されている。int型の定数。

                なので、「bool a = true;」とかやっても、intから_Boolへの暗黙の型変換が行われる、という話ですよ。

                親コメント
              • by Anonymous Coward

                stdbool.h に定義されてる true と false は論理値として用意されてるものなので bool のオブジェクトに代入するのは安心してできますね。
                対して、算術演算の結果が 0 や 1 になるからといって bool のオブジェクトにそれを代入するのは不安が残ります。演算の取りうる組み合わせをすべて検証したとしてもこの不安をなくすことはできないと思います。

              • by taka2 (14791) on 2019年11月09日 19時58分 (#3713655) ホームページ 日記

                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)」の方が意図が明確。

                親コメント
              • by Anonymous Coward

                C99で導入されたbool(_Bool)では、false/trueはintなので、結局三項演算子を使ってtrue/falseにしても、_Boolへの暗黙の型変換は行われてしいますよ。

                C99のstdbool.hは妥協の上での折衷案ですが、再定義も認められているのでそうすれば済む話ですね。

                #include <stdbool.h>

                #ifdef true
                #undef true
                #endif
                #define true ((_Bool)1)

                #ifdef false
                #undef false
                #endif
                #define false ((_Bool)0)

              • by Anonymous Coward

                When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1.

                という言語仕様でも不安がなくならないって、強迫神経症か何かなの?

              • by Anonymous Coward

                こんな再定義こそ「気持ち悪い」と言うのでは?

              • by Anonymous Coward

                otherwise, the result is 1.


                int hoge(int i)
                {
                        bool b = i;
                        return b == i;
                }

                が常に 1 返す保証でもない限りはスカラ値から論理型への変換は避けるべき。

              • by Anonymous Coward

                ごめん、その保証がないと何が不安なの?

              • by Anonymous Coward

                あんたでもtrueとfalseのかわりに全部1と0で書いてあるコードや、変数名がぜんぶ連番のコードを読まされたら怒るだろ?
                プログラミング言語の意味論と、人間にどう見えるかは全然別の話だよ
                プログラミング脳になっちゃってるのか、頭が悪いやつはごっちゃにしてるけどな

              • by Anonymous Coward

                味噌も糞も一緒な人に説明する意味がどれだけあるやら

              • by Anonymous Coward

                そうだよな。もともと人間にどう見えるかという話なのに、暗黙的な型変換は避けるべきとか、stdbool.hに定義されているtrueとfalseを使うべきとか言い始めるからおかしくなる。

              • by Anonymous Coward

                仕様としては 論理型(_Bool型)の bool と int 型の true(=1) と false(=0) だよ。

            • by Anonymous Coward

              そこは

              return !!f(x);

              が様式美じゃない?

              ゼロやnullじゃないってのはコメントがないとぱっと見では分からないけど、!!は瞬時にわかるしよく見かける(気がする)。

              • by Anonymous Coward

                !!は二重否定だからプログラミング言語の意味論以外には、トートロジーでしかない
                プログラム上にトートロジーがあるとは普通は思わないから、これを!一つと見間違える可能性が出てくる
                つか、なんども煮え湯を飲まされた
                f(x) ? true : falseは見ての通り冗長だが、間違えようがない
                他人に見せないときは好きにしろ

              • by Anonymous Coward

                !!って人生で10回も使った事無いと思うが、!!と!見間違えるか?
                見間違えるか、そうなのか。そうかもしれないな。まあ実際そんなに褒められた書き方じゃないと思ってるしな。

                とはいえ ? true : falseは個人的には!!よりかなり許せないレベルなんだが、
                boolean型がある言語ならそれへのキャストなり変換関数なりがあるんじゃないかな。

              • by Anonymous Coward

                一般論だが、間違えて思い込んでしまうと、そこから自力で抜け出すのは非常に難しい
                「!!」を実際に使う機会はおっしゃる通り少ないから、ロジックをあらかじめ知っていればともかく、他人のコードの「!!」は見間違えがちだ
                そうなると、そこ「以外」を切り刻んで、最後の最後に「もしや…上様」となってしまう

                俺も好きか嫌いかで言えば、?true:falseは好きではない
                何も計算していないからな
                しかし、止めてくれというほどの理由もないし、

                return b*b-4*a*c >= 0 ? true ; false;

                は、素直に「bかけるbひく4かけるaかけるcが0以上の『とき』に、真を返す」と読み下せるが

                return b*b-4*a*c

ハッカーとクラッカーの違い。大してないと思います -- あるアレゲ

処理中...