お世話になっております。C言語を学び20年ほど経ちましたが、未だにスマートな記述方法を知らないケースがあります。質問させてください。
配列dataの中から特定値VALUEを検索し、発見時に条件分岐することを考えます。
これをサブルーチン化せずに記述すると以下のようになりgoto/label構文が出てきます。もちろん、サブルーチン化とかフラグ管理という方法もありますが、goto/label構文以上に複雑になってしまっては本末転倒です。これをスマートに記す方法があればご教示願います。よろしくおねがいします。
C
1 2for(i = 0; i < N;i++) { 3 if(VALUE == data[i]){ 4 //当該データを発見した場合の処理。 5 goto label; 6 } 7} 8//当該データが存在しなかった場合の処理。 9label:;
サブルーチン化で検索という一機能をモジュール化できるならそうするのがスマートだと思います。
それによってテストも再利用も可能になり、コードの依存性も低くなります。
記述は増えるかもしれませんが、メインルーチンを読む際に検索の実装まで読む必要はなくなり、ループが関数呼び出しにかわることで単純になって可読性も高くなります。
できないのであれば、そこにはできない理由(極度のチューニングが求められるなど)があるはずなので、追及すべきはスマートさではなく実行効率などになるはずです。
検索の速度を上げたいのであれば、リニアサーチをやめてアルゴリズムとそれを支えるデータ構造を考え直すのが良いと思います。
どういう状況でしょうか?
C++tag ついてるけど、Cの質問?
C++なら std::find / std::find_if で解決するんだが。
> サブルーチン化とかフラグ管理という方法もありますが、goto/label構文以上に複雑になってしまっては本末転倒です。
個人的な範囲ですが、C言語のプログラミングでも goto/labelの出番を感じたことが無いので、むしろその感覚に少し違和感を感じます。「スマート」と思う主観に相違があるのでは。
> C言語のプログラミングでも goto/labelの出番を感じたことが無いので、
これは言い過ぎだったかも。多重ループからの脱出や、Linuxのドライバーなど、一部のプログラムでは散見されるケースはありますね。(私自身は使いませんが)
失礼、ライブラリ関数の利用は考えていないと書いていませんでした。これも含めようと思います。
> ライブラリ関数の利用は考えていないと書いていませんでした。
スマートじゃないです。
> ライブラリ関数の利用は考えていないと書いていませんでした。
後出しジャンケンかよー...回答に追記しました。
現在の自分の知見が正しいと確認したいがための質問じゃないの?
たぶん何を回答しても納得しない気がするなあ。
回答6件
あなたの回答
tips
プレビュー