質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

【C言語】switch分の中にif文とelse if文がある意味

解決済

回答 3

投稿

  • 評価
  • クリップ 2
  • VIEW 4,709

hasune

score 17

C言語のswitch文で質問があります。
switch文の中にif文とelse if文がある記述を見たのですが、
これが何をしたいのか分かりません。

switch文:式と同じものを比較して探す

if文とelse if:もし条件式が真なら処理1を、偽なら処理2を行う

という認識です。
処理速度は違うようですが、
同じ条件で同じ処理ができるものだと思っていたのでわざわざ入れ子にする意味が分かりませんでした。
調べてみてもあまりない記述方法なのか解答を得られませんでした。
お力を貸していただけないでしょうか。よろしくお願いいたします。

P.S.
C言語を勉強し始めてまだ日が浅いため、
お手間をお掛けしてしまい申し訳ありませんが、
初心者にも分かりやすいようなご回答をいただけますと助かります。
なにとぞよろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • pepperleaf

    2019/05/06 19:58

    具体的には、どんなコードでしょうか?
    switch()の中と、if() の中が同じ? って事は無いですね。
    見通しが悪くなるので、勧められるものではありませんが、時々は使うのではないかと思います。

    キャンセル

  • showkit

    2019/05/06 20:02

    pepperleaf のおっしゃる通り、コードがないとわからないでしょう。
    簡単に言えば、値が2つ以上のケースがある条件式を switch 文で書いてその1つケースの中で真値か偽値を持つ 条件式があれば if 文で書く。これは別に普通のことですが?

    キャンセル

  • hasune

    2019/05/07 19:56

    いろいろとぼかしてるため分かりづらくてすみません。
    記号はそれぞれ同じものが入ります。
    入れ子になっているのは分かるのですが、
    ここで何をしているのかが想像できません・・・。

    switch(式){
    case 1:
    if(▲▲[〇]<=■■){
    〇〇=(U4)(■■-▲▲[〇]):
    }
    else{
    〇〇=(U4)(◇◇-▲▲[〇]+■■):
    }
    break;

    キャンセル

回答 3

checkベストアンサー

+4

条件分岐が入れ子になることは普通に起こり得ることです。ifの中にifとかswitchの中でさらにswitchということもざらにありえます。

もっとも、仰るとおり統合できることもあります。それは状況次第なのでケースバイケースです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/08 21:18

    >stdioさん
    switchの中にswitchは書かないほうがいいのですか!
    私はまだコードを書いたことがないので読みやすい読みにくいが分からず、
    もしかしたらいつか自分が書く時にやってしまっていたかもしれません。

    アドバイスありがとうございます!

    キャンセル

  • 2019/05/09 10:07

    書いてみれば、なんとなく理解できると思いますよ。

    キャンセル

  • 2019/05/12 20:19

    >stdioさん

    レスが遅くなってしまい申し訳ありません。
    書く側になって初めて見えるものもありますもんね。
    ありがとうございました。

    キャンセル

0

よい例題が難しいのですが・・・。(あまりいい例ではなくて申し訳ない)

例えば、車に関する処理で、メーカが豊田・日産・本田とそれ以外のメーカで処理を分け、また、分けたもので、年式が2010年間までと2010年以降の車で処理を分けたいとします。
そのときは、下記のように書くのが自然です。

switch (メーカ)
{
case 豊田:
case 日産:
case 本田:
    if (年式 < 2010)
    {
        豊田か日産か本田の2010年年式より古い車の処理
    }
    else
    {
        豊田か日産か本田の2010年年式以降の車の処理
    }
    break;

default:
    if (年式 < 2010)
    {
        豊田か日産か本田以外の2010年式より古い車の処理
    }
    else
    {
        豊田か日産か本田以外の2010年年式以降の車の処理
    }
    break;
}

全部、if 文で書くならば

if ((メーカ == 豊田) ||
    (メーカ == 日産) ||
    (メーカ == 本田))
{
    if (年式 < 2010)
    {
        豊田か日産か本田の2010年年式より古い車の処理
    }
    else
    {
        豊田か日産か本田の2010年年式以降の車の処理
    }
    break;
}
else
{
    if (年式 < 2010)
    {
        豊田か日産か本田以外の2010年式より古い車の処理
    }
    else
    {
        豊田か日産か本田以外の2010年年式以降の車の処理
    }
    break;
}

これは、慣れた人には見にくい・・・。

全部、switch 文で書くならば・・・。

switch (メーカ)
{
case トヨタ:
case 日産:
case 本田:
    switch (年式)
    {
    書けない
    }
    break;

default:
    switch (年式)
    {
    書けない
    }
    break;
}

書けない。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/09 10:49

    私がコメント文にちゃんと
    {書きたくない,読みたくない,ナンセンス,……}的な語を明記しておけばよかったですね.

    switch( (年式<2010) + ((メーカ==トヨタ || メーカ==日産)<<1) )
    とかなんとか書いておけば,もうちょっとそういう雰囲気が出せたかなぁ…

    キャンセル

  • 2019/05/09 11:25

    真偽値について 誰にでもなく 補足しておけば。
    C 言語で if (条件式) の中身は 1 か 0 になります。
    偽が 0 で 真が 0 以外になりますので if (2) は then 条件になります。
    FORTRAN だと、真が 1 で 偽が 1 以外になりますので if 文の中の条件式は注意が必要です。

    キャンセル

  • 2019/05/12 20:23

    レスが遅くなってしまい申し訳ありません。
    多くの方にコメントいただけまして本当に感謝しております。
    皆様、ありがとうございました。総括でのお礼となってしまい申し訳ありません。

    私の勉強不足で会話についていけていませんが、
    今後の参考とさせていただきます!

    キャンセル

0

私は条件分岐が3つを超えるようならswitch文を使うようにしています。
またswitch文でもcase以下の処理が膨れ上がるようであれば、
関数テーブルにまとめてしまいます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/08 21:23

    申し訳ありません。求めている回答とは違う回答をしてしまったと思います。。

    キャンセル

  • 2019/05/12 20:30

    レスが遅くなってしまい申し訳ありません。
    いつか自分がコードを書く時が来ると思うので、
    どういう時にswitch文を書くか参考になります!
    アドバイスありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る