63045


[AtCoderの問題](https://atcoder.jp/contests/abc070/tasks/abc070_b)
に取り組んでいて自分でコードを書いたところ上手くいかないので質問させて頂きます。

**コード**

[code]

    #include  '<'iostream'>'
    using namespace std;
    int main() {
        int A, B, C, D;
    
        cin >> A >> B >> C >> D;
        if (C <= A) {
            if (D <= A) cout << 0 << endl;
            else if (A < D < B) cout << D - A << endl;
            else if(D >= B)     cout << B - A << endl;
        }
        else if (A < C < B) {
            if (D <= B) cout << D - C << endl;
            else if(D >=B)  cout << B - C << endl;
        }
        else 
            cout << 0 << endl;
    
        return 0;
    }
    
[/code]

Cのとる値で場合分けをしているのですが、最後の条件分岐の C >=Bの場合が上手く動作しません。

例)  
入力を5,10,20,40とした場合出力が0になる想定なのですが、-10と出力されてしまいます。  
コードが間違っているのでしょうか。教えて頂きたいです。


CC BY-SA 4.0
2020-02-14T04:41:37.760
63041
2020-02-14T05:04:07.340
2020-02-14T04:55:01.740
3060
36506
question
c++
C++においてif else文の条件分岐が上手くいかない


> `else if (A < C < B) {`

とあなたは書いていますが、真の意図は `A < C && C < B` でしょうか？

[c](/questions/tagged/c "'c' のタグが付いた質問を表示") / [c++](/questions/tagged/c%2b%2b
"'c++' のタグが付いた質問を表示") においては、言語仕様がそう定めている都合上 `A < C < B`
と書いても範囲比較にはなりません。仕様が定めている処理は下記のようになります

  * `A < C` の比較を行い、偽なら `false` `0` 真なら `true` `1` を得ます
  * 先の比較結果を使って `0 または 1 < B` の比較を行います

そのため入力として `B` に `10` を与えると `A < C < B` は常に真となります（`A` と `C` に何を与えても比較結果は `0`
または `1` なので）。  
もう一か所ありますよね


CC BY-SA 4.0
2020-02-14T05:03:51.203
63045
2020-02-14T05:03:51.203
8589
63041
answer

[code]

    if (A < D < B)
    
[/code]

という書き方ではなく

[code]

    if ( A < D && D < B )
    
[/code]

と書いてください。`A < D <
B`と書きたくなる気持ちは分かりますが、この式は文法的には正しくてコンパイルを通ってしまいますが、求めている判定とは違う結果を返します。


CC BY-SA 4.0
2020-02-14T05:04:07.340
63046
2020-02-14T05:04:07.340
5734
63041
answer