• ベストアンサー

超初心者です。HowTo本"独習C"の内容について2

続けてすみません。あと、 for(;;){ printf("ロード(L)、保存(S)、編集(E)、終了(Q)のどの処理を実行しますか?\n"); do{ printf("処理を選択してください:"); ch=getchar(); }while(ch!='L' && ch!='S' && ch!='E' && ch!='Q'); if(ch=='Q') break; /* 処理 */ /* 別の処理 */ /* その他 */ } 「こうすれば、chの値が'Q'かどうかを何回も判定しなくて済みます。if文が1つしか要らないので、より効率的です。」 ↑このコメントなのですが、Q以外の選択をした場合else if文を使うと思うのでif文は1つでは済まないと思うのですがどういうことなのでしょうか? アルゴリズムの理解がまったくできていなく、本当に初歩的な質問ばかりで申し訳ありません。 ですが、どうしてもCを学んでゆきたいので知りたいです。 どなたか教えてくださる方がいらっしゃいましたら、よろしくお願いします。 本当にお願いしますm(_ _)m

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

独習Cもってるので探してみてみました。 著者の言いたいことは、 上のプログラム例が無駄にQの判定をしているが、どうせQで終了するのだから最初にQを入力されたかどうかを判定しよう。 ということだと思います(文下手ですみません・・・)。 一応参考までにそのプログラム例を書いときます do{ printf("ロード(L)、保存(S)、編集(E)、終了(Q)のどの処理を実行しますか?\n"); do{ printf("処理を選択してください:"); ch=getchar(); }while(ch!='L' && ch!='S' && ch!='E' && ch!='Q'); if(ch != 'Q'){ /*処理*/ } if(ch != 'Q'){ /*処理*/ } /*などなど*/ }while(ch != 'Q'); //本では←のコロン抜けてますね。 これじゃ無駄になんどもQを判定しているから、最初からQだったらbreakしようと言いたかったんでしょう。

hisa_a10
質問者

お礼

回答して下さってありがとうございます。 やはり、そういうことでしたか。 Qを選択することを前提にしているのでこのような説明になっていたのですか。 意味を広く取ることが大切ですね。 ありがとうございました。

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

>if(ch=='Q') break; で for(;;) { を抜けていますから、その下の処理では考えなくても良いというぐらいの意味だと思います。 つまり、!= 'Q' の時に、LやSだと調べなくてもいいというような感じなのかな。 if(ch != 'Q' && ch == 'S'){ //S の処理 } if(ch != 'Q' && ch == 'L'){ //L の処理 } とか 仰るとおり else if にすれば良いような気もしますが・・ 本に書いてあることは、一面真実であっても必ずしもいつも正しいとは限らないのでそのような疑問を持つことは良いことだと思います。

hisa_a10
質問者

お礼

回答していただいてありがとうございます。 解釈の仕方としては、Qだった場合は最初にbreakでforループを抜けられるので、それ以降の文で判定する必要はないということでしょうか。 それでも他の処理をする場合はifなどで判定をしなければならないと思うのですが・・・ ただ、この文章の意味が単にbreakの効用を示しているだけであるというおおざっぱな読み方なら問題はないのかもしれません。 あまり意味を深く取りすぎないほうがいいのかもしれませんね。

関連するQ&A