アカウント名:
パスワード:
1968年の論文を踏まえて無軌道にgotoを使わなくてもいいように言語仕様が設計されたりプログラマーが使用を自重するようになったんだろ。
今となっては goto 文を使う人は、そうした方が見通しいい場合に限り使っているという印象case break の方が危ういね
#一般のブロック抜けgotoが欲しい
> #一般のブロック抜けgotoが欲しい
C言語だと,ブロックを別関数にして return を使う,というのが一つの解ですね.
別関数にすると,関数呼び出しのオーバヘッドを気にする人がいますが,オーバヘッドは生じません.今時のコンパイラは最適化処理が賢いので,無駄な関数呼び出しは自動でインライン展開されます.
ただ関数にするとローカル変数をすべて関数の引数として渡す必要があるので,コーディングするときは少々面倒です.
最近のC++だともっと綺麗かつ効率良いコードが書けます.具体的には
std::vector<int> a
その例なら、ラムダ式を使わないようにするともっときれいに書けるよ。
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 さんが何を言いたいのかわからない。
元コメの意図に添えているかはわかりませんが、for_eachとかしない場合にラムダ式でreturnを呼ぶってことだと思いますよ。for_eachを強引にとめる方法はもうthrowくらいしか思い浮かばないですが。
たぶんこうしたかったんでしょ。この例だと簡単すぎて何の意味もないけど。
std::vector a = {3,5,7,13,17}; [&]{ for(auto x:a) { if(x>10){return;} std::cout x std::endl;
スラッシュドットには <ecode> という謎要素があって、それを使うと不等号とかもよしなに扱ってくれるので、 C++ とかのコードをコメントとして書く場合にはお勧め。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
Stay hungry, Stay foolish. -- Steven Paul Jobs
原因と結果が逆 (スコア:5, すばらしい洞察)
1968年の論文を踏まえて無軌道にgotoを使わなくてもいいように言語仕様が設計されたりプログラマーが使用を自重するようになったんだろ。
Re: (スコア:2, すばらしい洞察)
今となっては goto 文を使う人は、そうした方が見通しいい場合に限り使っているという印象
case break の方が危ういね
#一般のブロック抜けgotoが欲しい
Re: (スコア:3, 興味深い)
> #一般のブロック抜けgotoが欲しい
C言語だと,ブロックを別関数にして return を使う,というのが一つの解ですね.
別関数にすると,関数呼び出しのオーバヘッドを気にする人がいますが,オーバヘッドは生じません.
今時のコンパイラは最適化処理が賢いので,無駄な関数呼び出しは自動でインライン展開されます.
ただ関数にするとローカル変数をすべて関数の引数として渡す必要があるので,コーディングするときは少々面倒です.
最近のC++だともっと綺麗かつ効率良いコードが書けます.具体的には
std::vector<int> a
Re: (スコア:3)
その例なら、ラムダ式を使わないようにするともっときれいに書けるよ。
というか、もともと C/C++ の break だけで済むコードをわざわざラムダ式と return に書き直してくれても、何がきれいだと言いたいのかさっぱりわからないんだけど……。二重のループの外側を for_each とラムダ式で書くと、内側を抜けるのは break で、外側を抜けるのは return で書けるからきれいとか、そういう話? 僕はそういう書き方が特にきれいだとは思わないけれど。
Re: (スコア:2)
いや、ごめんなさい、 break じゃなくて continue にしないと同じ挙動にならなかった……。ますます annoymouse coward さんが何を言いたいのかわからない。
Re: (スコア:0)
元コメの意図に添えているかはわかりませんが、for_eachとかしない場合にラムダ式でreturnを呼ぶってことだと思いますよ。for_eachを強引にとめる方法はもうthrowくらいしか思い浮かばないですが。
Re: (スコア:0)
たぶんこうしたかったんでしょ。
この例だと簡単すぎて何の意味もないけど。
std::vector a = {3,5,7,13,17};
[&]{
for(auto x:a)
{
if(x>10){return;}
std::cout x std::endl;
Re: (スコア:0)
Re:原因と結果が逆 (スコア:2)
スラッシュドットには <ecode> という謎要素があって、それを使うと不等号とかもよしなに扱ってくれるので、 C++ とかのコードをコメントとして書く場合にはお勧め。