うらおブログ(移転しました)スマートフォン用の表示で見るやねうらおブログ(移転しました)この広告は、90日以上更新していないブログに表示しています。yaneudoujou前回、ループの条件は後判定になることが多いということについて書いた。いま、次の列挙体について考えてみよう。};列挙体Aすべての要素に対して何らかのアクションを行ないたいとする。foreach構文のようなものがあれば良いのだが、不運にもいま対象としている言語には無いとしよう。この場合、次のように前判定で書く必要がある。++a)非常に読みづらい。doとwhileが(画面外ぐらいまで)離れていると、whileのところを見ないと、このループが何なのかすら理解できないだろう。このように複文を&&を用いて変形してwhileの条件式のところに書くのもあまり一般的なイデオムとは言えない。素直に以下のように書くほうが他の人に伝わりやすいコードだ。++a;}しかし、上のようなコードだと、Aが空集合の場合どうなるのだろうか。A.illegal(不正な要素)」という関係式が成り立つとして、この場合、上のコードだとdo_something(A.illegal);が一回実行されてしまう。これは、論理的におかしい。以上を加味すると、(C言語では)列挙体に対して、デリミタを次のように用意することによって後判定に書き換えることが多いのもうなづける。++a)do_something(a);本来のこの列挙体の集合の要素はx,y,zだけであり、delimiterというのは、この集合の外の要素を仮想的に導入したものである。この集合外の要素を変数aが取れるようにすることによって、ループを後判定に書き換えられるのである。書けば、Aが空集合であっても、do_something(A.illegal)は実行されない。C++で、STLのiteratorのend()が、終端の次の要素を指すようになっているのはこのような理由からだ。C/C++において、前判定で条件を書くための制御構文が不足しているというのは確かにそうだ。それゆえ、後判定で書けるように工夫すべきだというのもそうだろう。いう、C言語のセマンティックな特徴を度外視して考えたとしても、やはり(前判定よりは)後判定で書くほうが良いと思うだけの根拠がある。それについて考察していくとしよう。電子書籍になるに至るまでの話ブログちょっとだけ移転のお知らせ時代はまだゲームセンターあらしに追いつかないのかやねうら王、電王戦バージョン提出しました将棋の神様のレーティングはいくつなのか?月別アーカイブはてなブログをはじめよう!yaneuraoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。