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

C言語の開発者によるgoto文の使い方を対象とした実証研究の結果、「goto文は無害だと考えられる」」記事へのコメント

  • 原因と結果が逆 (スコア:5, すばらしい洞察)

    by Anonymous Coward

    1968年の論文を踏まえて無軌道にgotoを使わなくてもいいように言語仕様が設計されたりプログラマーが使用を自重するようになったんだろ。

    • Re: (スコア:2, すばらしい洞察)

      by Anonymous Coward

      今となっては goto 文を使う人は、そうした方が見通しいい場合に限り使っているという印象
      case break の方が危ういね

      #一般のブロック抜けgotoが欲しい

      • by annoymouse coward (11178) on 2015年02月15日 18時12分 (#2761521) 日記

        > #一般のブロック抜けgotoが欲しい

        C言語だと,ブロックを別関数にして return を使う,というのが一つの解ですね.

        別関数にすると,関数呼び出しのオーバヘッドを気にする人がいますが,オーバヘッドは生じません.
        今時のコンパイラは最適化処理が賢いので,無駄な関数呼び出しは自動でインライン展開されます.

        ただ関数にするとローカル変数をすべて関数の引数として渡す必要があるので,コーディングするときは少々面倒です.

        最近のC++だともっと綺麗かつ効率良いコードが書けます.具体的には

                  std::vector<int> a = {3,5,7,13,17};
                  std::for_each(a.begin(), a.end(),
                            [](auto x){
                                      if (x>10)
                                        return;
                                      std::cout << x << std::endl;
                            });

        みたいな感じで,ブロックをラムダ式で記述して,return で抜ける,と綺麗に書けます.
        ローカル変数を渡すのも簡単です

        ですので,goto使いたくなければ,C++で書く,というのは結構良い選択肢だと思います.

        親コメント
        • その例なら、ラムダ式を使わないようにするともっときれいに書けるよ。

          std::vector<int> a = {3, 5, 7, 13, 17};
          for (int x : a) {
              if (x > 10)
                  break;
              std::cout << x << std::endl;
          }

          というか、もともと C/C++ の break だけで済むコードをわざわざラムダ式と return に書き直してくれても、何がきれいだと言いたいのかさっぱりわからないんだけど……。二重のループの外側を for_each とラムダ式で書くと、内側を抜けるのは break で、外側を抜けるのは return で書けるからきれいとか、そういう話? 僕はそういう書き方が特にきれいだとは思わないけれど。

          親コメント
          • いや、ごめんなさい、 break じゃなくて continue にしないと同じ挙動にならなかった……。ますます annoymouse coward さんが何を言いたいのかわからない。

            親コメント
            • by Anonymous Coward

              元コメの意図に添えているかはわかりませんが、for_eachとかしない場合にラムダ式でreturnを呼ぶってことだと思いますよ。for_eachを強引にとめる方法はもうthrowくらいしか思い浮かばないですが。

              • by Anonymous Coward

                たぶんこうしたかったんでしょ。
                この例だと簡単すぎて何の意味もないけど。

                        std::vector a = {3,5,7,13,17};
                        [&]{
                                for(auto x:a)
                                {
                                        if(x>10){return;}
                                        std::cout x std::endl;

              • by Anonymous Coward
                <>が消えちゃったけど脳内補完して読んでください・・
              • うーん、なるほど、 return で脱出するだけのためにラムダ式を作ってすぐ呼ぶということか。

                二重のループから脱出したい、でも名前の付いた関数として分割するほどまとまった処理でもない、という場合に、その書き方は個人的には無駄に複雑な方法に見えるなあ。チーム内の取り決めとかでそういう書き方をすることになっていたら仕方ないけれど、そういう事情がなければ goto の方が数段マシな気がする。

                親コメント
              • スラッシュドットには <ecode> という謎要素があって、それを使うと不等号とかもよしなに扱ってくれるので、 C++ とかのコードをコメントとして書く場合にはお勧め。

                親コメント
            • by Anonymous Coward

              > ますます annoymouse coward さんが何を言いたいのかわからない。

              なまはんかな理解にもとづく「使いたがり」で使用するラムダ式は、gotoと同等以上の害がある。場合によってはgotoの方がよっぽどまし。

          • by Anonymous Coward

            単なる書き方の例なんじゃねーの? コードの内容ではなくてさ。
            ラムダ式の中に多重forループがあって、そこから一気に抜けたい場合とか。

            まぁ例が適切ではないのかもしれないけど、趣旨は汲んで上げようよ。

            • まぁ例が適切ではないのかもしれないけど、趣旨は汲んで上げようよ。

              例が適切でないだけかもしれないと思って趣旨を汲もうとした結果が、

              二重のループの外側を for_each とラムダ式で書くと、内側を抜けるのは break で、外側を抜けるのは return で書けるからきれいとか、そういう話? 僕はそういう書き方が特にきれいだとは思わないけれど。

              なんだけど……。

              親コメント
        • by ktmizugaki (46208) on 2015年02月15日 22時17分 (#2761639) 日記

          う、う~ん?これは綺麗なんでしょうか。

          大分話がそれますが、Ruby の each に渡すブロック内での、break と return の挙動がどうもしっくりきません……。

          switch の case と言えば昔C言語で、クラッシュの原因を探って行ったら、break 抜けだったことがありました。

          --
          svn-init() {
            svnadmin create .svnrepo
            svn checkout file://$PWD/.svnrepo .
          }
          親コメント
        • by Anonymous Coward

          今時のコンパイラは最適化処理が賢いので,無駄な関数呼び出しは自動でインライン展開されます.

          そんな頭のいいコンパイラなんてあるかなあ? 関数の大きさとかで一律に判断してるとかじゃないの。
          そんな条件も最適化オプションで変わったりするし、インライン展開させたい/させたくないってときにはプログラマが#pragmaとかでいちいち指定するのがいまだに普通だと思うが。

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

処理中...