パスワードを忘れた? アカウント作成
13475303 journal
プログラミング

shibuyaの日記: if statement の中の && とか || とか 12

日記 by shibuya

他所様日記ではCの話だけど、関連話題のコメント各論で言及している
各種インタープリタ言語すら別途動かすまでも無い。

というのも、副作用を十分に考慮しないという状況ならば script kiddy には
bash/ksh/zsh ほか shellインタープリタのワンライナーの手癖で安易に使える。
その副作用を含む挙動に十分配慮したまま難読でなくかつ保守しやすいように
というコストが高くつくなら敬遠するというのが自然な流れで。

WindowsでPowershellだとどうなるのかは知りません。たぶん厄介だと思う。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • もうやらないですねぇ
    エラー出したくなったときとかめんどいし
    年のせいか明確さ優先でそんなことにほんのささやかでも頭使う余裕が無い
    書き捨てなら使わんでも無いですが、
    人が見る可能性なあるコードならやりませんね
    if文中での代入やらforで二つ初期化、演算とかもやりませんねぇ

    • コメントありがとうございます。

      if 文の括弧と括弧閉じの中にエラー・ハンドリング書きたくない。
      シンプルに言えばこれだ。

      親コメント
    • ショートサーキットで問題がになるのは条件式に副作用がある場合で、それを前提にしたコードは書くべきではないとは思いますが、
      if条件式中で&&や||を使わずにどうするの?って逆に疑問に思ってしまいますねぇ。
      「if (cond1 && cond2) {…」は、「if (cond1) { if (cond2) {…」 って書いたりのでしょうか?
      # ショートサーキットは怖いとかいって 「if (cond1 & cond2) {」って書くと、非常に危険。

      > if文中での代入

      これはC++では多用してますね。変数宣言とセットで。CでもC99からはいけるんでしたっけ。

      if (FILE *fp = fopen(path, "rb")) {
           /* ファイルの内容を読み込む */
          fclose(fp);
      }

      みたいな感じ。ifの外では変数スコープが外れるので、そこで間違えてfcloseする心配はありません。

      if条件式中で変数宣言すると比較ができないので、主にポインタで使いますが、「boolにキャストすると正常時にtrueになる」ような値でもできますので、そういう使い方ができるようにメソッド設計でも考慮してます。

      あと、perlだとif文代わりのショートサーキットについては、and / or 演算子がありますね。

      open(my FH, "<", $path) or die "cannot open $path: $!";

      って感じで。

      親コメント
      • 条件式に副作用が無ければショートサーキットがあっても無くても処理結果は変わらないので、
        「ショートサーキットを利用しない」って言うのは「副作用のある条件式を(複数)使わない」ってことです
        流石に&&使わないとか、&使うとかって話じゃ無いですね…かさばりますし

        if文での代入はミスが出やすいのでやりたくないというところ
        ()忘れるとかですね
        if (result = func() != FAIL)
        とか
        んーでも単に単純にしたいって方が大きいかも

        宣言込みでスコープ縛れるのはかなり魅力的なんですけどね…
        若い子が見た目真似して先に書いたようなドジを踏むのが怖くてためらいます

        perlでよくやるやつはif文が無いからかそこまで気にならないですね
        専用単語立てて欲しい気はしますが
        then/elseとかだとモロかぶりでまずいか…

        メソッド設計はそういうの良いですよね

        親コメント
        • コメントありがとうございます。

          秘教秘儀に傾きかねない宗教論争ではなくて
          費用便益という実利に尽きるんでしょう。

          >若い子が見た目真似して
          >perlでよくやるやつはif文が無いから
          >メソッド設計は

          という補足説明を読んでいると一層そう思います。
          代償がなくて楽になるならそれに越したことは無いわけだが代償はある。

          親コメント
        • 判定処理に副作用が無い場合でも、ショートサーキットには「より頻度の高い(もしくは処理の軽い)条件判断を左に持ってくることで、判断処理の平均計算量負荷を下げることができる」という利点がありますよ。

          あとは、左辺が成立していることが右辺判定の実行可能条件になってる場合。「if (p && p->value > 0) {」とかですね。
          (元コメの「if (cond1 && cond2) { → if (cond1) { if (cond2) { 」で想定したのはこれです。

          if (p) {
              if (p->value > 0) {…

          って感じのコードは結構見かけると思います)

          親コメント
          • あとは、左辺が成立していることが右辺判定の実行可能条件になってる場合。「if (p && p->value > 0) {」とかですね。
            > (元コメの「if (cond1 && cond2) { → if (cond1) { if (cond2) { 」で想定したのはこれです。
            これは理解が及んでおりませんでした
            私もこういうのは使います
            気にならないのはイディオムとして捕らえてるのかなぁ

            親コメント
          • コメントありがとうございます

            >判断処理の平均計算量負荷を下げることができる

            レビュアー他人間の負荷に言及しているのか?とも思いましたが
            これもプログラム実行時の話ですよね。

            全体の比率から小さいにしても利点があって損得勘定に効いてくるかもですね。

            >で想定したのはこれです。

            Pascal 他の古典的(?)処理系・翻訳系でネストが深くてげんなりするタイプ
            の見た目をすっきりさせる効果は否定しません。
            それでいいのか?という判断留保もつきまといますけど。

            親コメント
        • by Anonymous Coward

          VB.NETだとAndThen/OrElseというショートサーキット評価用の演算子が追加されていますね。

      • コメントありがとうございます。

        >条件式に副作用がある場合

        熟慮すべき判断条件の要諦ですね。上記一言に尽くされている。
        反対解釈で判断のコストや判断間違いのリスクが負担できるなら
        ためらわないでよい、といったところ。
        別途議論はつくされてましょうけど。

        >「if (cond1) { if (cond2) {…」 って書いたりのでしょうか?

        こう書かないで済むなら避けたいですねえ。。。

        >perlだとif文代わりのショートサーキットについては、and / or 演算子

        手癖というか手垢にまみれた常套句として尊重しています。

        親コメント
typodupeerror

一つのことを行い、またそれをうまくやるプログラムを書け -- Malcolm Douglas McIlroy

読み込み中...