

if文の場合分け時にelse ifをよく使うのを見ますが、偶にifの箇条書きのように場合分けをしているのを見ました。

[code]

    if(){
    }else if(){
    }else if(){
    }
    
[/code]

と

[code]

    if(){}
    if(){}
    if(){}
    
[/code]

の違いはどのようなものでしょうか。


CC BY-SA 3.0
2018-03-08T07:15:55.783
42218
2019-11-23T13:12:01.820
2018-03-09T07:47:08.637
3054
27276
question
c
else if と if の羅列の違い

[code]

    if(){}
    else if(){} 
    
[/code]

は、

[code]

    if(){
    }else{
      if(){
      }
    }
    
[/code]

ということです。

[code]

    if(){}
    if(){}
    
[/code]

とはちょっとちがいますねー


CC BY-SA 3.0
2018-03-08T08:07:58.730
42223
2018-03-08T08:07:58.730
27481
42218
answer


用途に応じて使い分ける必要があると思います。

`else if`の方は3つの波括弧のうちいずれかしか処理されません。  
箇条書きの方は3つ全ての波括弧の中が処理される可能性があります。

* * *

簡単な例を挙げると

"abc"という文字列を、

  * (1)先頭が"a"で始まる
  * (2)最後が"c"で終わる
  * (3)"abc"という文字列である

の３パターンで評価する場合

`else if`では以下の場合は(1)の評価の括弧内の処理しか実行されません。

[code]

    if((1)の評価){
        // "a"で始まる文字列
    }else if((2)の評価){
        // "c"で終わる文字列
    }else if((3)の評価){
        // "abc"という文字列
    }
    
[/code]

一方、箇条書きの場合はすべての括弧内の処理が実行されます。

[code]

    if((1)の評価){
        // "a"で始まる文字列
    }
    if((2)の評価){
        // "c"で終わる文字列
    }
    if((3)の評価){
        // "abc"という文字列
    }
    
[/code]


CC BY-SA 3.0
2018-03-08T08:15:13.980
42225
2018-03-08T08:15:13.980
20272
42218
answer

[code]

    if(Ａ){
    }else if(Ｂ){
    }else if(Ｃ){
    }
    
[/code]

は、`switch case文`とほぼ同じです。処理の優先順位があり（Ａ＞Ｂ＞Ｃ）、Ａの条件がtrue（真）の場合は、条件Ｂ，Ｃの処理は行われません。

[code]

    if(Ａ){}
    if(Ｂ){}
    if(Ｃ){}
    
[/code]

は、Ａ、Ｂ、Ｃの条件が一致した何れかの処理を順次実行して進みます。


CC BY-SA 3.0
2018-03-08T08:16:31.360
42226
2018-03-08T08:16:31.360
22793
42218
answer


違いがわかるかもしれないコード例を考えてみました。

[code]

    int a=0;
    if( a==0){
       a++;  // ここに入りますが
    }
    else if( a == 1){// 一連のif()～else if()～elseについて、aはすでに「評価済み」なので
       a++;  // 入らない
    }
    else if( a == 2){
       a++;  // 入らない
    }
    // で、aは「1」になります。
    
[/code]

と

[code]

    int a=0;
    if( a==0){// 独立のif()です。
       a++;  // 評価結果が真なのでここに入ります
    }
    if( a==1){// これも独立のif()です。
       a++;  // なので、ここも入ります
    }
    if( a==2){// これも独立のif()です。
       a++;  // なので、ここにも入ります
    }
    // で、aは「3」になります
    
[/code]


CC BY-SA 3.0
2018-03-08T09:02:13.137
42228
2018-03-08T09:02:13.137
3793
42218
answer


疑問に思ったのであればサンプルコードを書いて実行してみてください。  
a, b, c の true, false を切り替えて実行してみれば動作の違いが判るかと思います。

[code]

    #include <stdio.h>
    #include <stdlib.h>
    #include <stdbool.h>
    
    int main(int argc, char *argv[])
    {
        bool a = false;
        bool b = true;
        bool c = true;
    
        if(a){
            printf("if-else : a is true.\n");
        }else if(b){
            printf("if-else : a is not ture, and b is true.\n");
        }else if(c){
            printf("if-else : a is not true, and b is not true, and c is true.\n");
        }
    
        if(a){
            printf("if : a is true.\n");
        }
        if(b){
            printf("if : b is true.\n");
        }
        if(c){
            printf("if : c is true.\n");
        }
    }
    
[/code]


CC BY-SA 3.0
2018-03-08T09:40:16.767
42230
2018-03-08T11:09:10.757
2018-03-08T11:09:10.757
27410
27410
42218
answer


例ー１

[code]

    int a= 10;
    if( a < 10 ){
        // ここには入らない
    }else if( a < 20 ){
        // ここに入る
    }else if( a < 30 ){
        // ここには入らない
    }
    
[/code]

例ー２

[code]

    int a= 10;
    if( a < 10 ){
        // ここには入らない
    }
    if( a < 20 ){
        // ここに入る
    }
    if( a < 30 ){
        // ここに入る
    }
    
[/code]

・・・全然別物になりますねd＾＾


CC BY-SA 3.0
2018-03-08T12:17:42.313
42233
2018-03-09T01:54:32.163
2018-03-09T01:54:32.163
49
25438
42218
answer


他の方の回答でも良いかと思いますが、、、、

[ _パターン A_ ]

> if ( _条件1_ ) { _処理1_ }  
>  else if ( _条件2_ ) { _処理2_ }  
>  else if ( _条件3_ ) { _処理3_ }

[ _パターン B_ ]

> if ( _条件1_ ) { _処理1_ }  
>  if ( _条件2_ ) { _処理2_ }  
>  if ( _条件3_ ) { _処理3_ }

の違いという事かと思います。

[ _パターン A_ ] の場合、" _条件1_ " に合致すると、" _処理1_ " を実行しますが、" _条件2_ " に合致しても、 " _処理2_
" は実行しません。  
[ _パターン B_ ] の場合、" _条件1_ " に合致すると、" _処理1_ " を実行し、" _条件2_ " に合致すると、 "処理2"
を実行します。  
従って、 " _条件1_ " と" _条件2_ " が同時に成立しない場合、結果は同じとなります。 " _条件3_ " も同様。

ただし、[ _パターン B_ ]の場合、" _条件1_ " に合致した場合でも、" _条件2_ " の評価が行われます。  
従って、" _条件1_ " と " _条件2_ " が同時に成立しない場合、" _条件1_ " に合致したでも" _条件2_
"の評価が行われるため、処理が余分に掛ります。  
具体的には、 _条件1_ : (A == 1)、 _条件2_ : (A == 2) のような場合、[ _パターン B_ ]の方が僅かですが **遅く**
なります。  
逆に、 _条件1_ : (A == 1)、 _条件2_ : (B == 1) のような場合、[ _パターン A_ ]と[ _パターン B_
]では(多くの場合) **結果が異なり** ます。


CC BY-SA 3.0
2018-03-08T13:04:50.753
42236
2018-03-08T13:04:50.753
42218
answer


箇条書きされた`if`文はあくまでソースコードを読み書きする人間が理解しやすいよう都合よく並べて書いているだけで、異なる`if(..)`が出てきた時点でロジック的には
**別の**`if`文です。

例えば「ある値が偶数か奇数か」はどちらか一方しか条件に当てはまらないので`if(..) else`を使う必要がありますが、

[code]

    int num = 2;
    
    if (num % 2 == 0) {
        printf "%d は偶数\n", num;
    }
    else {
        printf "%d は奇数\n", num;
    ]
    
[/code]

「ある値がx, yのそれぞれ倍数か調べたい」であればif文を箇条書きする形になると思います。

[code]

    int num = 10;
    
    if (num % 2 == 0) {
        printf "%d は2の倍数\n", num;
    }
    if (num % 5 == 0) {
        printf "%d は5の倍数\n", num;
    }
    
[/code]

* * *

個人的には条件文の異なる`if`文は1行以上空けて見分けやすいように記述したり、もしくは他の人の回答にもありますが`switch
case`文の様な条件を書きたいなら素直に`switch case`を使うべきかと思います。


CC BY-SA 3.0
2018-03-08T13:09:51.297
42237
2018-03-08T13:09:51.297
3060
42218
answer


> if(A){}  
>  if(B){}  
>  if(C){}

は3個の独立したif文です。

* * *

> if(A){  
>  }else if(B){  
>  }else if(C){  
>  }

は1個のif文です。→ `if(A)`  
`if(A)`のelse節が別のif文である`if(B)`になっています。  
同様に`if(B)`のelse節が別のif文である`if(C)`になっています。  
次のように書き直して考えれば違いが理解しやすいと思います。

[code]

    if(A)
    {
        ...
    }
    else
    {
        if(B){
            ...
        }
        else
        {
            if(C)
            {
                ...
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2019-11-23T13:12:01.820
60790
2019-11-23T13:12:01.820
35558
42218
answer