Compound condition in C: if (0.0 < a < 1.0)

后端 未结 4 2038
忘掉有多难
忘掉有多难 2020-12-04 02:31

I recently noticed that the following expression compiles in my compiler (Clang):

float a;
if (0.0 < a < 1.0) { ... }

Does this do wh

相关标签:
4条回答
  • 2020-12-04 02:57

    Does this do what I expect?

    No as it is very simple. < operator is having a left to right associativity it check as follows

    (0.0 < a < 1.0 ) is simply
    
    (0.0 < a) < 1.0
    

    in second form

    int main()
    {
            float a = 8.4;
            if (0.0 < a && a < 9) //same as ( 0.0 < a) && (a < 9)
            printf("x");
    }
    

    o/p=x

    0 讨论(0)
  • 2020-12-04 03:07

    Because of left-to-right associativity of < operator the expression condition (0.0 < a < 1.0) means ((0.0 < a) < 1.0) == 1 < 1.0 or 0 < 1.0 depending on value of a.

    So no, its not identical to if (0.0 < a && a < 1.0) (perhaps you might confusing from Python compassion rule) but in C it will be interpenetrated as I explained above.

    A difference you can observe in an example --- 0.0 < a < 1.0 == true when a == 0.0, where as (0.0 < a && a < 1.0) == false, for a == 0.0, below is my code (read comments):

    #include<stdio.h>
    void print_(int c){
        c ? printf("True \n"):
            printf("False \n");
    }
    int main(void){
        float a = 0.0f;
        print_(0.0f < a < 1.0f); // 0.0 < 0.0 < 1.0f == 0 < 1.0f == True
        print_(0.0f < a && a < 1.0f); // 0.0f < 0.0f && ... ==  False && ... = False
        return 0;
    }
    

    output:

    True 
    False
    

    Check its working @Ideone

    0 讨论(0)
  • 2020-12-04 03:11

    Does this do what I expect?

    No, it does

    (0.0 < a) < 1.0
    

    and (0.0 < a) yields 0 or 1. So you end up having 0 < 1.0 or 1 < 1.0 evaluated.

    Note that in some other languages it does what you expect.

    For example in Python,

    a < b < c
    

    is called a chained comparison and it is equivalent to:

    (a < b) and (b < c)
    
    0 讨论(0)
  • 2020-12-04 03:11

    Maybe we can think in this way(just for fun):

    if(0.0 <a < 1.0)
    

    ==>

    if((0.0 <a)<1.0)
    

    think :

    if 0.0 < a == true, then (true <1.0) == false!

    else if 0.0 < a == false ,then (false <1.0) == true!

    So I can translate if(0.0 <a <1.0) to if(!(0.0<a))

    Interesting , right?

    0 讨论(0)
提交回复
热议问题