I recently noticed that the following expression compiles in my compiler (Clang):
float a;
if (0.0 < a < 1.0) { ... }
Does this do what I expect? I would expect that it evaluates identically to this condition:
if (0.0 < a && a < 1.0) { ... }
If it is so, since when and with which other compilers it is possible to write conditions in this short form?
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
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With