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

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

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Q&A

解決済

5回答

2677閲覧

if文とelse ifについてお聞きしたいことがあります

DR.Dexter00

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

0グッド

0クリップ

投稿2019/09/20 19:36

編集2019/09/20 19:46
1〜100の中で if(2の倍数){} else if(3の倍数){} else if(4の倍数){}

と書いたものは

最初のifで100の中から2の倍数を取り、

次のelse ifは100から2の倍数を取ったあまりの残った数字から3の倍数をとるという事でしょうか?

だとしたら

1〜100の中で if(2の倍数){} if(3の倍数){}

は1〜100の中の2の倍数を取り、次のifでは100から2の倍数を取ったあまりではなく、初期値の100から3の倍数を取るのでしょうか?
二つの疑似プログラムの違いがいまいちわかりません。

便図的には上の二つはどのようになるのでしょうか?

if (条件式1) { 条件式1が真の時に実行する処理; ...; }else if(条件式2) { 条件式1が偽で条件式2が真の時に実行する処理; ...; }else if(条件式3) { 条件式1及び条件式2が偽で条件式3が真の時に実行する処理; ...; }else{ 全ての条件式が偽の時に実行する処理; ...; }

より、else ifにより前のifが無かった場合の話なので再び初期値の100を使うと思うのですが、だとしたら全部をels ifを使わずにif文だけ使えばいいように思えてしまいます。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2019/09/20 22:39

「便図」とはなんですか?ググっても「紙本淡彩十便図」という国宝ぐらいしか引っかからず、一体何を指しているのかがわかりません。 また、制御の流れがどうなるのかを見たいのなら、フローチャートかUMLのアクティビティ図の方が良いかと思うのですが、そちらではダメなのでしょうか?
DR.Dexter00

2019/09/21 07:12

すいません。もっとよく調べます
thkana

2019/09/22 00:38

結局マルチポストも複数アカウントも処理しきれてない(問題の解決に寄与していない)じゃない... もういいや。https://oshiete.goo.ne.jp/qa/11300749.html はあなたとたまたま同じ疑問を抱いた誰かさんの質問、ということにしよう。
guest

回答5

0

Cをベースに考えているのなら、言語のレベルで「集合」を扱うことは出来ませんから、if文の働きレベルの話をするときに

(1~)100の中から2の倍数を取り、

次のelse ifは(1~)100から2の倍数を取ったあまりの残った数字から3の倍数をとる
※()は回答者注

のように、「1~100の中から」なんて話まで先走らないほうがいいです。基本の構文でつまづく人は、頭の中で勝手に存在しない条件を足したり適用される条件を無視したりしておかしな結果にたどり着いて自爆することが多いように思います。まずは極力シンプルにしてから考えましょう。

で、説明としてはy_waiwaiさん式ですが、その前に確認。

if文の構文はいいですか?
if(式) 文 [else 文] ([ ]部分は無ければ省略可能)
です。
if文の話とは別に、{ 文 文 文 ...}として0個以上複数の文を{ }で括るとこれを一つの文として扱うことになっているので
if(式) { 文 文 文 ...}
という記述が出来ることになります。
(文が一つだと{ }を省略出来る、などという説明をする人がいますがそれはちょっと違う。それと、文; のように文のあとにセミコロンをつける人がいるのも間違い。式に;が付くと文になりますけれど、文には;をつけちゃいけない。if文やfor文は;を必要とせずに文ですから)

なので、if自体が文なので、
if (式) 文 else 文
の文 (elseの方)にif文を記述することが出来て
if (式) 文 else if(式) 文
が成立します。{ }で文をくくれば

if (式) { 文 } else { if (式) 文 }

と書いても等価なことは理解できますね?
で、コメントの付け方としてこうしてみてはいかが。

C

1if( 条件1 ){ 2 //条件1が真のときの処理 3} else { 4 //条件1が偽のとき 5 if( 条件2 ){ 6 //条件2が真のとき 7 } else { 8 //条件2が偽とき 9 if( 条件3 ){ 10 //条件3が真のとき : A 11 } else { 12 //条件3が偽のとき 13 } 14 } 15}

Aにたどり着くまでには
条件1が偽のとき -> 条件2が偽のとき -> 条件3が真のとき
を辿っているのが明確になるでしょう。
一方、

C

1if( 条件1 ){ 2 //条件1が真のとき 3} else { 4 //条件1が偽のとき 5} 6if( 条件2 ){ 7 //条件2が真のとき 8} else { 9 //条件2が偽のとき 10} 11if( 条件3 ){ 12 //条件3が真のとき : A 13} else { 14 //条件3が偽のとき 15}

Aにたどり着くには
条件1はどっちでもいい -> 条件2もどっちでもいい -> 条件3が真のとき
ですから、違いは明らかですね。

どーでもいいですが、ベン図の「ベン」はイギリス人の人名(Venn)です。漢字では書きません。

[追記]
イメージを掴む助けになるかとScratchで描いてみましたけど、どうでしょう。
イメージ説明

[追記2]
ついでに妄想を膨らませて関連事項をちょっと。
ある変数の値によっていくつかの分岐を行う場合ってあるでしょう。
変数selの値が0だったら...1だったら...2だったら(整数値ならswitch文でも書けますが、それは置いといて)
そして、その分岐した処理の中で変数の値を書き換えることもあるかも知れません。そのような場合には

C

1//ここでselが0だったとして 2if(sel==0){ 3 sel=1; 4} 5if(sel==1){ 6 sel=0; 7} 8if(sel==2){ 9<> 10} 11//ここでのselの値は?

C

1//ここでselが0だったとして 2if(sel==0){ 3 sel=1; 4} else if(sel==1){ 5 sel=0; 6} else if(sel==2){ 7<> 8} 9//ここでのselの値は?

とで結果が違ってきます。もちろん自分のやりたい処理に適した方を書くのですが、経験的には後者のような処理が求められることが多い(ほとんど、かな)ように思います。


さらにelse ifからの連想ネタですが、
よくある「課題」で、試験の点数でランク分け、というのがあります。0~60点はD、61~70点がC、71~80点がB、それ以上A、とか。このようなときに、しばしば

C

1if( 0 <= score && score <= 60 ){ 2 rank = 'D'; 3} else if( 61 <= score && score <= 70 ){ 4 rank = 'C'; 5} else if( 71 <= score && score <= 80 ){ 6 rank = 'B'; 7} else if( 81 <= score && score <= 100 ){ 8 rank = 'A'; 9}

と書かれている例を見受けます。間違いではないですが、先述のようにコメントを入れるとすると、

C

1if( 0 <= score && score <= 60 ){ 2 rank = 'D'; 3} else { 4// 0点以上60点以下でなかった場合(つまり-1点以下か61点以上だった場合) :A 5 if( 61 <= score && score <= 70 ){ //:B 6 rank = 'C'; 7 } else { 8 //61点以上70点以下でなかった場合(つまり60点以下か71点以上だった場合) 9 if( 71 <= score && score <= 80 ){ 10 rank = 'B'; 11 } else { 12 //71点以上80点以下でなかった場合(つまり70点以下か81点以上だった場合) 13 if( 81 <= score && score <= 100 ){ 14 rank = 'A'; 15 } 16 } 17}

見てみると、Aに到達するためには61点以上という条件が含まれています。なので、Bのところで61 <= scoreの条件は常に満たされているわけで、調べるだけ無駄。
さらに言えば、試験の点数ですから0~100点というのは暗黙の了解となるでしょう。入力ミスとかには別途対応してここを「点数のランク付け」という作業に絞るならscore < 0 あるいは100 < scoreの判別も不要ということになります。以上を盛り込んで整理すると

C

1if( score <= 60 ){ 2 rank = 'D'; 3} else if( score <= 70 ){ 4 rank = 'C'; 5} else if( score <= 80 ){ 6 rank = 'B'; 7} else { 8 rank = 'A'; 9}

で十分な場合もある、ということです。同様の処理をelse ifを使わなければ

C

1if( score <= 60 ){ 2 rank = 'D'; 3} 4if( 61 <= score && score <= 70 ){ 5 rank = 'C'; 6} 7if( 71 <= score && score <= 80 ){ 8 rank = 'B'; 9} 10if( 81 <= score ){ 11 rank = 'A'; 12}

ですから、else ifを使って整理したほうがスッキリして見える...と私は思います。敢えて言えば後者は

C

1if( 81 <= score ){ 2 rank = 'A'; 3} 4if( score <= 60 ){ 5 rank = 'D'; 6} 7if( 71 <= score && score <= 80 ){ 8 rank = 'B'; 9} 10if( 61 <= score && score <= 70 ){ 11 rank = 'C'; 12}

みたいに、if文の記述順に依存しないのがメリット...と言えなくもないですけれど、こんな書き方すると条件の漏れとか起こしがち。

投稿2019/09/21 02:57

編集2019/09/22 00:21
thkana

総合スコア7652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DR.Dexter00

2019/09/21 05:34

どうもありがとうございます!
guest

0

else if という構文はありません。
たんに、else節の中にif文があるだけです

C

1if (条件式1) { 2 条件式1が真の時に実行する処理; 3 ...; 4}else{ 5 if(条件式2) { 6 条件式1が偽で条件式2が真の時に実行する処理; 7 ...; 8 }else{ 9 if(条件式3) { 10 条件式1及び条件式2が偽で条件式3が真の時に実行する処理; 11 ...; 12 }else{ 13 全ての条件式が偽の時に実行する処理; 14 ...; 15 } 16 } 17}

とカッコをつければわかりやすいかと。

投稿2019/09/20 23:00

y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DR.Dexter00

2019/09/21 05:34

どうもありがとうございます!
guest

0

c

1if(2の倍数){} // A0 2else if(3の倍数){} // B0

c

1if(2の倍数){} // A1 2if(3の倍数){} // B1

2 は A0, A1 で処理されます。
3 は B0, B1 で処理されます。
6 は A0, A1, B1 で処理されます。

if ... else ... では if の条件が成立すれば、その処理をして、else 以下はスキップします。、
6 は 2の倍数 かつ 3 の倍数です。
2 の倍数での処理が行われても、3 の倍数での処理はスキップされます。
6 に対して 2 の倍数と 3 の倍数の両方の処理をさせたいなら、 else を使わずに if ... if ...  と羅列する必要があります。

投稿2019/09/20 21:19

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DR.Dexter00

2019/09/21 05:34

どうもありがとうございます!
guest

0

ベストアンサー

else ifの場合は上から評価していって、ヒットすれば、残りの条件は評価せずにブロックを抜けます。例えば、100の場合だと、2の倍数の条件を実行したら、以降の条件は実行しません(つまり、4の倍数、5の倍数、他の100の約数の場合は処理されません)。

C

1100を通す場合 2 3if(2の倍数) 4{ 5 /* 6 100は2の倍数であるので、条件が合致し、 7 2の倍数の場合の処理が実行される。 8 */ 9} 10/*** 2の倍数という条件を満たしたので、これ以降の条件は評価されない ***/ 11else if(3の倍数) 12{ 13} 14else if(4の倍数) 15{ 16} 17

一方、elseが無い場合は、全ての条件が評価され、合致すれば、実行されます。例えば、100の場合は2の倍数、4の倍数、5の倍数と100の約数のケースが評価されて実行されます。

C

1100を通す場合 2 3if(2の倍数) 4{ 5 /* 100は2の倍数なので、評価され実行される。 */ 6} 7if(3の倍数) /* 100は3の倍数ではないので、処理は実行されない */ 8{ 9 /* 実行されない */ 10} 11if(4の倍数) /* 100は4の倍数であるので、処理が実行される。 */ 12{ 13 /* 実行される */ 14}

要は、全ての条件を評価させるのならばelseを使わず、if文だけを続けていき、条件群の途中で抜けたい場合はelse ifで続けると言った感じです。

投稿2019/09/20 20:38

編集2019/09/20 21:02
archiver

総合スコア1557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DR.Dexter00

2019/09/21 05:34

どうもありがとうございます!
guest

0

ふ~ん、大虐殺君なの呆。

二つの疑似プログラムの違いがいまいちわかりません。

私なら、これを試してもらう。プログラムを動かしてみれば良いじゃないか。上限は100まで要らない、16程度で十分。

C

1#include <stdio.h> 2#define MAX (16) 3int main(void) 4{ 5 int n; 6 7 for (n = 1; n <= MAX; n++) { 8 printf("%d : ", n); 9 if ((n % 2) == 0) { 10 printf("2の倍数です "); 11 } else if ((n % 3) == 0) { 12 printf("3の倍数です "); 13 } else if ((n % 4) == 0) { 14 printf("4の倍数です "); 15 } 16 printf(".\n"); 17 } 18 printf("================\n"); 19 for (n = 1; n <= MAX; n++) { 20 printf("%d : ", n); 21 if ((n % 2) == 0) { 22 printf("2の倍数です "); 23 } 24 if ((n % 3) == 0) { 25 printf("3の倍数です "); 26 } 27 if ((n % 4) == 0) { 28 printf("4の倍数です "); 29 } 30 printf(".\n"); 31 } 32 return 0; 33}

実行結果は以下。

  • 上側のforループで表示されるのは、それぞれの値につき高々ひとつだけ。4の倍数と表示されることはない。
  • 下側なら12のように、複数表示されることがある。

違いは明確です。

1 : . 2 : 2の倍数です . 3 : 3の倍数です . 4 : 2の倍数です . 5 : . 6 : 2の倍数です . 7 : . 8 : 2の倍数です . 9 : 3の倍数です . 10 : 2の倍数です . 11 : . 12 : 2の倍数です . 13 : . 14 : 2の倍数です . 15 : 3の倍数です . 16 : 2の倍数です . ================ 1 : . 2 : 2の倍数です . 3 : 3の倍数です . 4 : 2の倍数です 4の倍数です . 5 : . 6 : 2の倍数です 3の倍数です . 7 : . 8 : 2の倍数です 4の倍数です . 9 : 3の倍数です . 10 : 2の倍数です . 11 : . 12 : 2の倍数です 3の倍数です 4の倍数です . 13 : . 14 : 2の倍数です . 15 : 3の倍数です . 16 : 2の倍数です 4の倍数です .

ベン図を描いてみたけど省略。普通の人はフローチャートで理解すると思う。

投稿2019/09/22 04:22

rubato6809

総合スコア1380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問